工厂方法模式

92 阅读2分钟

对象创建模式

  • 避免用 new 创建过程中需要依赖具体类,从而支持对象创建的稳定

  • 避免紧耦合,对拓展是开放的,对修改是封闭的

  • 典型对象创建模式

    • Factory Method
    • Abstract Factory
    • Builder
    • Prototype
    • Singleton

从一个非常简单的案例开始

  • 需求:处理从文件里面读出的数据
  • 设计:DataManager 类,FileReader 类

image.png

问题

  • 要从不同的数据源读数据处理,重复代码太多,有重构空间
  • 遇到不确定需求,形成资源浪费

解决方案

  • 将不同类型抽象成一个接口
  • 创建一个工厂接口实现接口类型的实例

工厂方法 - 意图

  • 定义一个用于创建对象的接口,让子类决定实例化哪一个具体类。
  • Factory Method 使一个类的实例化延迟到其子类
  • 目的:解藕

工厂方法 - 动机

  • 框架使用抽象类定义和维护对象之间的关系
  • 对象的创建通常也由框架负责

工厂方法 - 适用场景

  • 当一个类不知道它所必须创建的对象的类的时候
  • 当一个类希望由它的子类来指定它所创建的对象的时候
  • 当类将创建对象的职责委托给多个帮助子类的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候

工厂方法 - 结构

image.png

工厂方法 - 结构组成

  • Product(DataReader):定义工厂方法所创建的对象的接口
  • ConcreteProduct(FileDataReader):实现 Product 接口
  • Creator(DataReaderFactory):声明工厂方法,该方法返回一个 Product 类型的对象
  • ConcreteCreator:重定义工厂方法以创建一个 Product 对象

模式总结

  • Factory Method 主要目的是为了解藕对象使用者与具体类型之间的紧耦合关系
  • Factory Method 使一个类的实例化延迟到子类
  • Factory Method 符合开闭原则和依赖倒置原则
  • Factory Method 缺点:客户可能仅仅为了创建一个特定的 ConcreteProduct 对象,九不得不创建 Creator 的子类