对象创建模式
-
避免用 new 创建过程中需要依赖具体类,从而支持对象创建的稳定
-
避免紧耦合,对拓展是开放的,对修改是封闭的
-
典型对象创建模式
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Singleton
从一个非常简单的案例开始
- 需求:处理从文件里面读出的数据
- 设计:DataManager 类,FileReader 类
问题
- 要从不同的数据源读数据处理,重复代码太多,有重构空间
- 遇到不确定需求,形成资源浪费
解决方案
- 将不同类型抽象成一个接口
- 创建一个工厂接口实现接口类型的实例
工厂方法 - 意图
- 定义一个用于创建对象的接口,让子类决定实例化哪一个具体类。
- Factory Method 使一个类的实例化延迟到其子类
- 目的:解藕
工厂方法 - 动机
- 框架使用抽象类定义和维护对象之间的关系
- 对象的创建通常也由框架负责
工厂方法 - 适用场景
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建的对象的时候
- 当类将创建对象的职责委托给多个帮助子类的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候
工厂方法 - 结构
工厂方法 - 结构组成
- Product(DataReader):定义工厂方法所创建的对象的接口
- ConcreteProduct(FileDataReader):实现 Product 接口
- Creator(DataReaderFactory):声明工厂方法,该方法返回一个 Product 类型的对象
- ConcreteCreator:重定义工厂方法以创建一个 Product 对象
模式总结
- Factory Method 主要目的是为了解藕对象使用者与具体类型之间的紧耦合关系
- Factory Method 使一个类的实例化延迟到子类
- Factory Method 符合开闭原则和依赖倒置原则
- Factory Method 缺点:客户可能仅仅为了创建一个特定的 ConcreteProduct 对象,九不得不创建 Creator 的子类