java设计模式--工厂方法模式

来源:互联网 发布:实名认证数据网 编辑:程序博客网 时间:2024/06/07 03:08

        工厂模式是java比较重要的模式之一,工厂模式又可以分为简单工厂模式、工厂方法模式和抽象工厂模式,在有些书中也把简单工厂模式归类为工厂方法模式。下面我通过我

的学习来对他们进行一个总结。

1. 简单工厂模式

        简单工厂模式有三种角色组成:

抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 

工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 


1) 定义一个抽象类产品

public interface Car{      public void drive(); } 
2) 定义二个具体类产品,继承了抽象类产品

public class DaZong implements Car{ 
     public void drive() { 
        System.out.println("Driving DaZong "); 
     } 
}

public class Bmw implements Car{ 

       public void drive() { 
           System.out.println("Driving Bmw "); 
       } 

3)定义工厂类

public class DriverFactory{

         public static Car driverCar(String s)  throws Exception {

                        //判断逻辑,返回具体的产品角色给Client 
                       if(s.equalsIgnoreCase("DaZong ")) 

                                return new DaZong (); 

                       else if(s.equalsIgnoreCase("Bmw")) 

                                return new Bmw();

}}

4)客户端代码

public class Driver{ 
public static void main(String[] args){ 
try{ 
Car car = DriverFactory.driverCar("DaZong"); //调用工厂类
//下命令:开车 
car.drive(); }}

上面就是简单工厂模式的一个示例,我们定义一个抽象产品接口,并定义了两个具体产品类,定义了一个工厂类,工厂类是通过传的不同的参数来实例化不同的对象,所以就会有一个问题,不能扩展,每次扩展都得去修改工厂类,这样就违反了开闭原则(对扩展开放,对修改关闭)。所以简单工厂模式适合比较简单的情况,对于复杂的情况是不适合的。


2. 工厂方法模式

        工厂方法模式的四种角色:

抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

        从上面的四个角色可以推断,工厂方法模式在简单工厂模式的基础上进行了又一次抽象,多了一个具体工厂模式,这说明工厂方法模式中,为每一个具体产品提供一个工厂类,这样我们就可以进行产品的扩展。下面通过实例类看一下:

1)定义抽象产品角色

public interface Flying{
    void fly();
}

2)定义两个具体产品角色

public class AirPlane implements Flying{
    @Override
    public void fly() {
        System.out.println("airplane....");
    }
}

public class Rocket implements Flying{
    @Override
    public void fly() {
        System.out.println("rocket.....");
    }
}

3)定义抽象工厂

public abstract class WineFactory {
    abstract Flying create();
}

4)为每个具体产品定义各自的工厂类

public class AirPlaneFactory extends WineFactory{
    public Flying create() {
        return new AirPlane();
    }
}

public class RocketFactory extends WineFactory{
    public Flying create() {
        return new Rocket();
    }
}
5)测试类

public class Test {
    public static void main(String[] args) {
        WineFactory airfactory = new AirPlaneFactory();
        Flying f = airfactory.create();
        f.fly();
    }
}

      从上面的代码实例可以清楚的看到,工厂方法模式为每个具体产品提供了一个对应的工厂类,这样就可以对产品进行扩展啦。


0 0