zoukankan      html  css  js  c++  java
  • 简单工厂模式

    1.定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。
    简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    2. uml类图

    3.优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。


    4.缺点 : 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
    当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
    这些缺点在工厂方法模式中得到了一定的克服。

    5.使用的场景&例子:工厂类负责创建的对象比较少;
    客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
    由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

     

    具体实现:

    抽象的运算类

     1 package cn.bj.patterns.factory.easyFactory.operation;
     2 
     3 /**
     4  * @author liuboren
     5  * @Title:运算类
     6  * @Description:
     7  * @date 2018/5/9 12:38
     8  */
     9 public interface Operation {
    10 
    11     //运算类
    12     Double getResult(Double num1,Double num2);
    13 }

     

    具体的加法运算类

     1 /**
     2  * @author liuboren
     3  * @Title:具体的加法运算类
     4  * @Description:
     5  * @date 2018/5/9 12:39
     6  */
     7 public class OperationAdd implements Operation {
     8 
     9     @Override
    10     public Double getResult(Double num1, Double num2) {
    11         return  num1+num2;
    12     }
    13 }

     

    具体的减法运算类

     1 /**
     2  * @author liuboren
     3  * @Title:具体的减法运算类
     4  * @Description:
     5  * @date 2018/5/9 12:42
     6  */
     7 public class operationSub implements  Operation {
     8     @Override
     9     public Double getResult(Double num1, Double num2) {
    10         return num1 - num2;
    11     }
    12 }

     

    具体的乘法运算类

     1 /**
     2  * @author liuboren
     3  * @Title:具体的乘法运算类
     4  * @Description:
     5  * @date 2018/5/9 12:43
     6  */
     7 public class operationMul implements  Operation {
     8     @Override
     9     public Double getResult(Double num1, Double num2) {
    10         return num1*num2;
    11     }
    12 }

     

    具体的除法运算类

     1 /**
     2  * @author liuboren
     3  * @Title:具体的除法运算类
     4  * @Description:
     5  * @date 2018/5/9 12:44
     6  */
     7 public class operationDeduct implements  Operation {
     8     @Override
     9     public Double getResult(Double num1, Double num2) {
    10         if (num2!=0) {
    11             return num1 / num2;
    12         }else{
    13             try {
    14                 throw  new Exception("除数不能为零");
    15             } catch (Exception e) {
    16                 e.printStackTrace();
    17             }
    18             return null;
    19         }
    20     }
    21 }

     

    工厂类:
     1 /**
     2  * @author liuboren
     3  * @Title:工厂类
     4  * @Description:
     5  * @date 2018/5/10 19:14
     6  */
     7 public class OperationFactory {
     8 
     9         /**
    10           *获得操作类方法
    11           */
    12           public static Operation getOperation(String  type){
    13               Operation operation = null ;
    14               switch (type ){
    15                   case "+":
    16                   operation = new OperationAdd();
    17                     break;
    18 
    19                   case "-":
    20                       operation = new operationSub();
    21                       break;
    22                   case "*":
    23                       operation = new operationMul();
    24                       break;
    25                   case "/":
    26                       operation = new operationDeduct();
    27                       break;
    28               }
    29               return  operation;
    30           }
    31 
    32 
    33 }

     

     

    测试类:

     1 /**
     2  * @author liuboren
     3  * @Title:测试类
     4  * @Description:
     5  * @date 2018/5/10 19:11
     6  */
     7 public class Test {
     8     public static void main(String [] args){
     9         Operation operation = OperationFactory.getOperation("+");
    10         Double num = operation.getResult(1.0,2.0);
    11         System.out.println("得到的num是:"+num);
    12 
    13         Operation operationSub = OperationFactory.getOperation("-");
    14         Double numSub = operationSub.getResult(1.0,2.0);
    15         System.out.println("得到的num是:"+numSub);
    16 
    17         Operation operationMul = OperationFactory.getOperation("*");
    18         Double numMul = operationMul.getResult(1.0,2.0);
    19         System.out.println("得到的num是:"+numMul);
    20 
    21         Operation operationDeduct = OperationFactory.getOperation("/");
    22         Double numDeduct = operationDeduct.getResult(1.0,2.0);
    23         System.out.println("得到的num是:"+numDeduct);
    24     }
    25 }

     

    一个简单的工厂模式就实现了.

     

    说句题外话,工厂类使用的是switch进行条件判断,其实使用if/else同样也是可以实现的,但是switch和if/else在性能上还是有区别的.

    在多条件下,if ...else...语句要从上至下一个一个的比较,但是switch可以直接命中。如果大家懂汇编代码的话可以去看下编译后的汇编代码,在多条件下生成的汇编代码是完全不一样的,
    if语句生成的代码会根据条件的增加而增加,所以多条件下switch会更快,但是switch也有不好的地方,比如支持的类型没有if灵活。

    总结:多条件判断的条件下,switch比if/else效率要高,但是没有if/else灵活

    具体使用情况:如果在条件匹配少的情况下,可以使用if...else...但是如果匹配条件多的情况下可以使用可以使用switch。

     
    github: https://github.com/liuboren0617/designpatterns/tree/master/src/easyfactory

       

      

  • 相关阅读:
    PyQt作品 – PingTester – 多点Ping测试工具
    关于和技术人员交流的一二三
    Pyjamas Python Javascript Compiler, Desktop Widget Set and RIA Web Framework
    Hybrid Qt applications with PySide and Django
    pyjamas build AJAX apps in Python (like Google did for Java)
    PyQt 维基百科,自由的百科全书
    InfoQ:请问为什么仍要选择Java来处理后端的工作?
    Eric+PyQt打造完美的Python集成开发环境
    python select module select method introduce
    GUI Programming with Python: QT Edition
  • 原文地址:https://www.cnblogs.com/xisuo/p/9213119.html
Copyright © 2011-2022 走看看