老生长谈的两个设计模式了,这里把这两个设计模式对比着来总结一下。
- 什么是简单工厂模式?
- 简单工厂模式:根据传入工厂类的参数动态决定要创建哪一个产品类的实例。
- UML图如下(以实现一个计算器为例):
- 简单工厂模式的Java代码实现如下:
(1)首先创建一个抽象运算类Operation.java,里面有一个抽象方法GetResult(),留到子类去实现
1 /** 2 * 3 * 运算类 4 * 5 */ 6 abstract class Operation{ 7 public double numberA, numberB; 8 public void setNumberA(double numberA){ 9 this.numberA = numberA; 10 } 11 public void setNumberB(double numberB){ 12 this.numberB = numberB; 13 } 14 public abstract double GetResult(); 15 }
(2)创建加法类addOperation.java和减法类subOperation.java,继承运算类
1 /** 2 * 3 * 加法类 4 * 5 */ 6 class addOperation extends Operation{ 7 8 @Override 9 public double GetResult() { 10 // TODO Auto-generated method stub 11 return super.numberA+super.numberB; 12 } 13 14 } 15 16 /** 17 * 18 * 减法类 19 * 20 */ 21 class subOperation extends Operation{ 22 23 @Override 24 public double GetResult() { 25 // TODO Auto-generated method stub 26 return super.numberA-super.numberB; 27 } 28 29 }
(3)创建工厂类FactoryOperation.java
1 /** 2 * 3 * 工厂类 4 * 5 */ 6 class FactoryOperation{ 7 public Operation CreateOperate(char type){ 8 switch (type) { 9 case '+': 10 Operation add = new addOperation(); 11 return add; 12 case '-': 13 Operation sub = new subOperation(); 14 return sub; 15 default: 16 return null; 17 } 18 } 19 }
(4)客户端代码如下
1 public class SimpleFactory { 2 3 public static void main(String[] args){ 4 5 double numberA = 6,numberB = 2; 6 7 FactoryOperation factoryOperation = new FactoryOperation(); 8 Operation add = factoryOperation.CreateOperate('+'); 9 add.setNumberA(numberA); 10 add.setNumberB(numberB); 11 double addResult = add.GetResult(); 12 13 Operation sub = factoryOperation.CreateOperate('-'); 14 sub.setNumberA(numberA); 15 sub.setNumberB(numberB); 16 double subResult = sub.GetResult(); 17 18 System.out.println("addResult="+addResult+",subResult="+subResult); 19 } 20 }
现在我们思考一个问题:如果此时我想加入乘法呢?可以想到的是加入一个乘法类,同时还要修改工厂类,加入相应的判断逻辑。我们知道,软件设计中有一个原则:依赖-倒转原则(对扩展开放,对修改不开放),很显然,简单工厂模式不符合该原则。下面我们讲的工厂模式能否克服简单工厂的缺点呢?
- 什么是工厂模式?
- 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
- UML图如下(以实现一个计算器为例)