zoukankan      html  css  js  c++  java
  • SimpleFactory

    工厂模式的几种形态:

    1. 简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)
    2. 工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic)模式或虚拟构造子(Virtual Constructor)模式。
    3. 抽象工厂(Abstract Factory)模式,又称工具箱(Toolkit)模式。


    工厂模式优点 :把具体使用 new 操作符的细节包装和隐蔽起来。


    简单工厂简略图

    • 工厂类:简单工厂的核心,含有对应用紧密相关的逻辑。在客户端的直接调用下创建产品对象。
    • 抽象产品:简单工厂模式所创建的对象的父类。
    • 具体产品:所创建的具体实例。

    简单工厂模式优点

    • 模式的核心是工厂类,这个类有必要的判断逻辑,决定什么时候创建哪一个产品类的实例。

    简单工厂模式缺点

    • 当产品类有复杂的多层次等级结构时,工厂类只有一个,则需要把太多的逻辑集中在一个工厂类中。但产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展是较为困难的。这一缺点在工厂方法模式得到克服。
    • 由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。这一缺点在工厂方法模式得到克服。
    • 对于“开-闭”原则支持不够。(增加新的产品必将导致工厂类的修改)
     1 public abstract class Operation
     2 {
     3 
     4     private double a;
     5 
     6     private double b;
     7 
     8     public double getA()
     9     {
    10         return a;
    11     }
    12 
    13     public void setA(double a)
    14     {
    15         this.a = a;
    16     }
    17 
    18     public double getB()
    19     {
    20         return b;
    21     }
    22 
    23     public void setB(double b)
    24     {
    25         this.b = b;
    26     }
    27 
    28     public abstract double getResult();
    29 
    30 }
    1 public class OperationAdd extends Operation
    2 {
    3     @Override
    4     public double getResult()
    5     {
    6         return getA() + getB();
    7     }
    8 }
     1 public class OperationDiv extends Operation
     2 {
     3     @Override
     4     public double getResult()
     5     {
     6         if (getB() != 0)
     7         {
     8             return getA() / getB();
     9         }
    10         System.out.println(" b can not be zero ! ");
    11         return 0;
    12     }
    13 }
     1 public class OperationFactory
     2 {
     3     public static Operation createOperationFactory(String expression)
     4     {
     5         Operation operation = null;
     6         if ("+".equals(expression))
     7         {
     8             operation = new OperationAdd();
     9         } else if ("/".equals(expression))
    10         {
    11             operation = new OperationDiv();
    12         }
    13         return operation;
    14     }
    15 }
    1     public static void main(String[] args)
    2     {
    3         Operation operation = OperationFactory.createOperationFactory("/");
    4         operation.setA(62);
    5         operation.setB(2);
    6         System.out.println(operation.getResult());
    7     }


    Advantage:

    1、面向对象:封装、继承、多态。

    2、使用OperationFactory.createOperationFactory(),让业务逻辑与界面逻辑分开,之间的耦合度降低。可达到容易维护与扩展。

    3、把每一种的运算方法分离,修改其中一个而不影响另外几个,增加其它运算代码(如 减法、求开根号)也不影响其它类的代码,只需要添加多一种运算类extends Operation。若只让修改一种运算代码,那么不需要公开其它的运算代码。

    4、如何让计算器知道我希望用哪一种算法呢? SimpleFactory只需要输入符号,工厂就能实例化合适的对象,通过多态返回父类的方式实现了计算器的结果。

     

  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2389260.html
Copyright © 2011-2022 走看看