简单工厂模式
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
喜欢我的博客就请点赞+【关注】一波