SimpleFactory

工厂模式的几种形态:

  1. 简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)
  2. 工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic)模式或虚拟构造子(Virtual Constructor)模式。
  3. 抽象工厂(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只需要输入符号,工厂就能实例化合适的对象,通过多态返回父类的方式实现了计算器的结果。

 

 

posted @ 2012-03-10 16:32  Kyle_Java  阅读(782)  评论(1编辑  收藏  举报