设计模式(二 & 三)工厂模式:2-工厂方法模式
- 模拟场景:
沿用 设计模式(二)工厂模式:1-简单工厂模式 中关于运算器 Operation 的例子。
- 思想:
针对在 Easy Factory 中提出的,破坏“开-闭原则”的问题,Factory Method 提出了另一种解决方案:
将生产运算器的工厂抽象出来(AbsOperationFactory),然后为原来每一个需要创建的对象(extends AbsOperation),都建立一个专门的工厂。
这样一来,可以巧妙地利用多态的性质,完成对代码的解耦。
- 工厂方法模式的组成结构:
- 抽象工厂(Abstract Factory)
- 具体工厂(Concrete Factory)
- 抽象产品(Abstract Product)
- 具体产品(Concrete Product)
- UML:
- UML 分析:
这是一个简化版的 Operation UML 类图。
具体工厂 OperationAddFactory 通过 Override 父类的 createOperation() 方法,将返回类型由抽象产品 AbsOperation 缩小为具体产品 OperationAdd。
- 代码:
public abstract class AbsOperation { protected abstract BigDecimal calc(double a, double b); }
public abstract class AbsOperationFactory { protected abstract AbsOperation createOperation(); }
public final class OperationAdd extends AbsOperation { OperationAdd() { } @Override public BigDecimal calc(double a, double b) { return new BigDecimal(a).add(new BigDecimal(b)); } }
public final class OperationAddFactory extends AbsOperationFactory { public OperationAdd createOperation() { return new OperationAdd(); } }
- 优势:
遵循了“开闭原则”。
由调用方决定具体需要哪一个 Operation。
- 劣势:
针对每一种产品,都需要多创建一个工厂对象。
- 和 简单工厂模式 中的反射形式比较:
更多的内存开销。
但是使用 new 关键字来创建对象,相比使用反射创建对象,更快,也更加安全(反射对于创建复杂对象不具备普适性),也容易在编译期间发现错误。