一、概述
定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行。
工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品。
工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,解决了许多简单工厂模式的问题,完全实现‘开-闭 原则’,让扩展变得简单,让继承变得可行,增加了多态性的体现。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
1.1、适用场景
创建对象需要大量重复的代码
应用层不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建那个对象
1.2、优缺点
优点
用户只需要关心所需产品对应的工厂,无须关系创建细节
加入新产品,只需要增加相应的具体产品类和相应的工厂子类即可,符合开闭原则,提高可扩展性
每个具体工厂类只负责创建对应的产品,符合单一职责原则
缺点
添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销。
由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
一个具体工厂只能创建一种具体产品
1.3、类图角色及其职责
1.4、演进过程
版本一、简单工厂模式问题【违背开闭原则】
有了002-创建型-01-简单工厂 非GOF设计模式 的引入,但是每次如果我们要增加新的具体工厂时。我们就需要修改已经写好的工厂。如增加一个梨的类
public class Pear implements Fruit { //具体产品 @Override public void get() { System.out.println("采集梨子"); } }