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只需要输入符号,工厂就能实例化合适的对象,通过多态返回父类的方式实现了计算器的结果。

     

  • 相关阅读:
    2016 Multi-University Training Contest 1 solutions BY HIT
    Unicode 码表
    用 lambda 表达式 对 List 进行排序
    Linux的sed命令介绍
    Linux下的NTP服务搭建
    Linux网络配置(ip命令及配置文件)
    Linux的bash脚本编程(if语句和循环语句)
    Linux新手必须掌握的命令(2)
    Linux的文件查找
    bash中的变量
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2389260.html
Copyright © 2011-2022 走看看