简单工厂模式

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

   

  

原文地址:https://www.cnblogs.com/xisuo/p/9213119.html