SimpleFactory
工厂模式的几种形态:
- 简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)
- 工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic)模式或虚拟构造子(Virtual Constructor)模式。
- 抽象工厂(Abstract Factory)模式,又称工具箱(Toolkit)模式。
工厂模式优点 :把具体使用 new 操作符的细节包装和隐蔽起来。
简单工厂简略图
- 工厂类:简单工厂的核心,含有对应用紧密相关的逻辑。在客户端的直接调用下创建产品对象。
- 抽象产品:简单工厂模式所创建的对象的父类。
- 具体产品:所创建的具体实例。
简单工厂模式优点
- 模式的核心是工厂类,这个类有必要的判断逻辑,决定什么时候创建哪一个产品类的实例。
简单工厂模式缺点
- 当产品类有复杂的多层次等级结构时,工厂类只有一个,则需要把太多的逻辑集中在一个工厂类中。但产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展是较为困难的。这一缺点在工厂方法模式得到克服。
- 由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。这一缺点在工厂方法模式得到克服。
- 对于“开-闭”原则支持不够。(增加新的产品必将导致工厂类的修改)
1 public abstract class Operation 2 { 3 4 private double a; 5 6 private double b; 7 8 public double getA() 9 { 10 return a; 11 } 12 13 public void setA(double a) 14 { 15 this.a = a; 16 } 17 18 public double getB() 19 { 20 return b; 21 } 22 23 public void setB(double b) 24 { 25 this.b = b; 26 } 27 28 public abstract double getResult(); 29 30 }
1 public class OperationAdd extends Operation 2 { 3 @Override 4 public double getResult() 5 { 6 return getA() + getB(); 7 } 8 }
1 public class OperationDiv extends Operation 2 { 3 @Override 4 public double getResult() 5 { 6 if (getB() != 0) 7 { 8 return getA() / getB(); 9 } 10 System.out.println(" b can not be zero ! "); 11 return 0; 12 } 13 }
1 public class OperationFactory 2 { 3 public static Operation createOperationFactory(String expression) 4 { 5 Operation operation = null; 6 if ("+".equals(expression)) 7 { 8 operation = new OperationAdd(); 9 } else if ("/".equals(expression)) 10 { 11 operation = new OperationDiv(); 12 } 13 return operation; 14 } 15 }
1 public static void main(String[] args) 2 { 3 Operation operation = OperationFactory.createOperationFactory("/"); 4 operation.setA(62); 5 operation.setB(2); 6 System.out.println(operation.getResult()); 7 }
Advantage:
1、面向对象:封装、继承、多态。
2、使用OperationFactory.createOperationFactory(),让业务逻辑与界面逻辑分开,之间的耦合度降低。可达到容易维护与扩展。
3、把每一种的运算方法分离,修改其中一个而不影响另外几个,增加其它运算代码(如 减法、求开根号)也不影响其它类的代码,只需要添加多一种运算类extends Operation。若只让修改一种运算代码,那么不需要公开其它的运算代码。
4、如何让计算器知道我希望用哪一种算法呢? SimpleFactory只需要输入符号,工厂就能实例化合适的对象,通过多态返回父类的方式实现了计算器的结果。