我想学会设计模式之工厂模式

247 阅读2分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战


我想学会设计模式之工厂模式

image-20210816081054336

什么是工厂方法模式?

工厂方法模式属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义在于定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,仅负责声明具体工厂子类必须实现的接口。这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。


工厂方法模式的应用场景

  • 第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
  • 第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的

工厂方法模式的优缺点

优点
  • 工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。
  • 工厂方法模式每个具体工厂类只完成单一任务,代码简洁。职责单一
  • 工厂方法模式完全满足OCP,即它有非常良好的扩展性。
缺点
  • 假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。
  • 当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。比如说,每增加一个产品,相应的也要增加一个子工厂,会加大了额外的开发量。

代码实现

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

public interface Fruit {
    void get();
}
public interface FruitFactory {
    Fruit getFruit();
}
public class Apple implements Fruit {
    @Override
    public void get() {
        System.out.println("我是苹果类");
    }
}
public class Apple implements Fruit {
    @Override
    public void get() {
        System.out.println("我是苹果类");
    }
}
public class Test {
    public static void main(String[] args) {
        //获得 AppleFactory
        FruitFactory fruitFactory = new AppleFactory();
        //通过AppleFactory 获得Apple
        Fruit apple = fruitFactory.getFruit();
        apple.get();
    }
}