一、概述

  定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行。

  工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品。

  工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,解决了许多简单工厂模式的问题,完全实现‘开-闭 原则’,让扩展变得简单,让继承变得可行,增加了多态性的体现。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

  工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

1.1、适用场景

  创建对象需要大量重复的代码

  应用层不依赖于产品类实例如何被创建、实现等细节

  一个类通过其子类来指定创建那个对象

1.2、优缺点

优点

  用户只需要关心所需产品对应的工厂,无须关系创建细节
  加入新产品,只需要增加相应的具体产品类和相应的工厂子类即可,符合开闭原则,提高可扩展性
  每个具体工厂类只负责创建对应的产品,符合单一职责原则
缺点

  添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销。
  由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
  一个具体工厂只能创建一种具体产品

1.3、类图角色及其职责

  002-创建型-01-工厂方法模式(Factory Method)

   1、抽象工厂(Creator)角色:(FruitFactory)
      是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
   2、具体工厂(Concrete Creator)角色:(AppleFactory、BananaFactory)
      这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
   3、抽象产品(Product)角色:(Fruit)
      工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
   4、具体产品(Concrete Product)角色:(Apple、Banana)
      这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

1.4、演进过程

版本一、简单工厂模式问题【违背开闭原则】

  有了002-创建型-01-简单工厂 非GOF设计模式 的引入,但是每次如果我们要增加新的具体工厂时。我们就需要修改已经写好的工厂。如增加一个梨的类

public class Pear implements Fruit {  //具体产品
    @Override
    public void get() {
        System.out.println("采集梨子");
    }
}
View Code

相关文章: