定义
- 定义:Define an interface for creating an object,but let subclasses decide which class to instance.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类)
优点
- 良好的封装性,代码结构清晰。(不需要知道创建对象的过程,只需要知道产品的类名或约束字符串就可以完成对象的创建。降低模块之间的耦合)
- 工厂模式方法的扩展性优秀。(在增加产品类的情况下,只要适当地修改具体的工厂类,或扩展一个工厂类,就可以完成”拥抱变化”)
- 屏蔽产品类。(产品类的实现如何变化,调用者都不用关心,它只关系产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化)。
使用场景
- 需要灵活的,可扩展的框架时。(要慎重考虑是否使用工厂类管理,会增加代码的复杂性)
- 举例:
- 连接邮件服务器的框架,有三种网络协议可以选择:POP3、IMAP、HTTP。可以把这三种连接方法作为产品类
- 举例:
分类
通用类图
工厂方法模式通用类图
延迟加载的工厂模式通用类图
工厂模式(模板)
简介
- 工厂模式的变种比较多,以下是一个比较通用的工厂模式模板
类图
代码
抽象产品类
1 |
|
具体产品类(继承自抽象产品类)
1 |
|
抽象工厂类
1 |
|
具体工厂类(继承自抽象工厂类)
1 |
|
测试方法
1 |
|
测试结果
静态工厂模式
简介
- 工厂模式的一种弱化,称为简单工厂模式或静态工厂模式,实际项目中使用的比较多
- 缺点
- 扩展困难,不符合开闭原则
类图
代码
静态工厂类
1 |
|
产品类
- 同上
测试方法
1 |
|
测试结果
多工厂模式
简介
- 为每一个产品定义一个工厂,由调用者去选择与那个工厂方法关联
- 每个工厂都独立负责创建对应的产品对象,符合单一职责原则
- 复杂应用一般使用多工厂的方法,然后增加一个协调类,用于封装子工厂类,对高层模块提供统一的访问接口
- 缺点
- 扩展困难(每增加一个产品类就需要建立一个相应的工厂类,同时维护时还需要考虑两个对象之间的关系)
类图
代码
抽象多工厂类
1 |
|
产品1生产工厂类(继承自抽象多工厂类)
1 |
|
产品2生产工厂类(继承自抽象多工厂类)
1 |
|
产品类
- 同上
测试代码
1 |
|
测试结果
单例工厂模式
简介
- 通过工厂模式反射来生成单例对象
- 在一个项目中可以产生一个单例构造器,所有需要产生单例的类都遵循一定的规则(构造方法是private),然后通过扩展该框架,只需要输入一个类型就可以获得唯一的一个实例
类图
代码
单例工厂类
1 |
|
单例产品类
1 |
|
测试代码
1 |
|
测试结果
注意
- 工厂模式是典型的解耦框架,符合下列原则
- 迪米特法则:高层模块只需要知道产品的抽象类,其他的实现类都不用关心。我不需要的就不要去交流。
- 依赖倒置原则:只依赖产品类的抽象。
- 里氏替换原则:可以使用产品子类替换产品父类。
- 此处使用的是抽象类而非接口,实际上根据工厂模式的定义,使用两者都可以,选择的关键就在于对于产品类而言,是否有共有的构造或者方法。