设计模式(二 & 三)工厂模式:2-工厂方法模式

  • 模拟场景:

  沿用 设计模式(二)工厂模式:1-简单工厂模式 中关于运算器 Operation 的例子。

 

  • 思想:

  针对在 Easy Factory 中提出的,破坏“开-闭原则”的问题,Factory Method 提出了另一种解决方案:

  将生产运算器的工厂抽象出来(AbsOperationFactory),然后为原来每一个需要创建的对象(extends AbsOperation),都建立一个专门的工厂。

  这样一来,可以巧妙地利用多态的性质,完成对代码的解耦。

  

  • 工厂方法模式的组成结构:
  1. 抽象工厂(Abstract Factory)
  2. 具体工厂(Concrete Factory)
  3. 抽象产品(Abstract Product)
  4. 具体产品(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 关键字来创建对象,相比使用反射创建对象,更快,也更加安全(反射对于创建复杂对象不具备普适性),也容易在编译期间发现错误。

 

posted @ 2017-09-16 23:22  Gerrard_Feng  阅读(218)  评论(0编辑  收藏  举报