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

       

      

  • 相关阅读:
    Java中的static关键字解析
    Hadoop记录-metastore jmx配置
    Hadoop记录-hadoop jmx配置
    Hadoop记录-yarn ResourceManager Active频繁易主问题排查(转载)
    Hadoop记录-hive merge小文件
    Linux记录-salt命令
    Hadoop记录-Hadoop监控指标汇总
    Hadoop记录-日常运维操作
    Hadoop记录-技术网站
    Hadoop记录-Hadoop jmx
  • 原文地址:https://www.cnblogs.com/xisuo/p/9213119.html
Copyright © 2011-2022 走看看