工厂方法模式
概述
工厂方法模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型
解决方案
工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用(即是用new运算符),不过并不是取消new运算符,只是该运算符改在工厂方法中调用罢了。工厂方法返回的对象通常被称为”产品“
工厂方法模式适用应用场景
-
当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系,可使用工厂方法模式
工厂方法将创建产品的代码与实际使用产品的代码分离,从而能在不影响其他代码的情况下扩展产品创建部分代码
例如,如果需要向应用中添加一种新产品,你只需要开发新的子类,然后重写工厂方法即可
-
如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法
理论上说,继承可能是扩展软件库或框架默认行为的最简单方法
但正确的解决方案是将各框架中构建组件的代码集中到单个工厂方法中,并在继承该组件之外允许任何人对该方法进行重写
-
如果你希望复用现有对象来节省系统资源,而不是每次都创建对象,可使用工厂方法
在处理大型资源密集型对象时,你会经常碰到这种资源需求
实现方式
- 让所有产品都遵循同一接口,该接口必须声明对所有产品都有意义的方法
- 在创建类中添加一个空的工厂方法,该方法的返回类型必须遵循通用的产品接口
- 在创建者代码中找到对于产品构造函数的所有引用
- 为工厂方法的每种产品编写一个创建者子类,然后在子类中重写工厂方法
- 如果应用中的产品类型太多,那么为每个产品创建子类并无太大必要,这是可以在子类中复用基类的控制参数
工厂方法模式的优缺点
优点:
- 可以避免创建者和具体产品之间的紧密耦合
- 符合单一职责原则
- 符合开闭原则
缺点:
因为引入了很多子类,所以代码可能会因此变得特别复杂