zoukankan      html  css  js  c++  java
  • 设计模式(二 & 三)工厂模式: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 关键字来创建对象,相比使用反射创建对象,更快,也更加安全(反射对于创建复杂对象不具备普适性),也容易在编译期间发现错误。

  • 相关阅读:
    Python基础----内置函数补充、匿名函数、递归函数
    为arm-linux开发板挂载基于nfs的根文件系统
    vsftp上传553 Could not create file错误解决
    在itop4412移植linux4.14和设备树遇到的问题及解决
    itop4412uboot中支持usbhub
    上下界网络流
    lca(最近公共祖先(在线)) 倍增法详解
    lca(最近公共祖先(离线))
    最小费用最大流
    spfa模板+讲解
  • 原文地址:https://www.cnblogs.com/jing-an-feng-shao/p/7533443.html
Copyright © 2011-2022 走看看