合工大很牛很牛牛

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks

设计一个Pizza店,Pizza的制作过程为:createPizza( )——>orderPizza( ),其中createPizza()又由prepare,bake,cut,box四个过程组成。Pizza的种类也有多种。

整个关系图如下:




下面是用户点一个CheesePizza后的时序图:


全部代码如下:
 1 package SimpleFactory;
 2 
 3 public class Main
 4 {
 5 
 6     public static void main(String[] args)
 7     {
 8         PizzaStore store = new PizzaStore();
 9         store.createPizza("Cheese");
10         store.orderPizza();
11     }
12 }
13 

 1 package SimpleFactory;
 2 
 3 public class PizzaStore
 4 {
 5 
 6     private Pizza mPizza;
 7 
 8     public Pizza orderPizza()
 9     {
10         mPizza.prepare();
11         mPizza.bake();
12         mPizza.cut();
13         mPizza.box();
14         return mPizza;
15     }
16 
17     public Pizza createPizza(String pizzaName)
18     {
19         if (pizzaName.equals("Cheese"))
20         {
21             mPizza = new CheesePizza();
22             System.out.println("CheesPizza created.");
23         }
24         else if (pizzaName.equals("ClamPizza"))
25         {
26             mPizza = new ClamPizza();
27             System.out.println("ClamPizza created.");
28         }
29         return mPizza;
30     }
31 }
32 
33 



我们看到PizzaStore类中的19~28行,出现了if...else if...,当又有新的Pizza品种时,显然这个createPizza函数免不了再加一个else if...
按照设计模式的原则,我们希望PizzaStore这个类整体保持固定,把变化的部分封装出去:
其结论就是用一个新的类来专门负责new 各种类型的实体——这个新类就是SimpleFactory:



到PizzaStore点一个CheesePizza的流程如下:


相比原代码,需变动PizzaStore的createPizza方法,还有新增一个PizzaFactory类:

 1 package SimpleFactory;
 2 
 3 public class PizzaStore
 4 {
 5 
 6     private PizzaFactory mPizzaFactory;
 7     private Pizza mPizza;
 8 
 9     public Pizza orderPizza()
10     {
11         mPizza.prepare();
12         mPizza.bake();
13         mPizza.cut();
14         mPizza.box();
15         return mPizza;
16     }
17 
18     public Pizza createPizza(String pizzaName)
19     {
20         mPizzaFactory = new PizzaFactory();
21         mPizza = mPizzaFactory.factoryPizzaCreation(pizzaName);
22         return mPizza;
23     }
24 }
25 
26 

 1 package SimpleFactory;
 2 
 3 public class PizzaFactory
 4 {
 5 
 6     private Pizza mPizza;
 7     
 8     public Pizza factoryPizzaCreation(String pizzaName)
 9     {
10         if (pizzaName.equals("CheesePizza"))
11         {
12             mPizza = new CheesePizza();
13             System.out.println("CheesPizza created.");
14         }
15         else if (pizzaName.equals("ClamPizza"))
16         {
17             mPizza = new ClamPizza();
18             System.out.println("ClamPizza created.");
19         }
20         return mPizza;
21     }
22 
23    
24 }
25 
26 

可见,所谓的Simple Factory的实质就是:
问题:可能根据不同条件返回同一种类型的不同结果,且该条件在不断的变化中,我们需要封装这种变化。(不仅仅是encapsulate object creation)
结论:写一个专门的类,该类中的一个方法来实现上面的条件判断。
posted on 2008-05-21 13:31 化的了 阅读(1028) 评论(3)  编辑  收藏 所属分类: 设计模式

Feedback

# re: 简单工厂 Simple Factory 2008-05-22 16:24 Nicholas.Yuen
好漂亮的图.
请问使用什么工具生成的呢?  回复  更多评论
  

# re: 简单工厂 Simple Factory 2008-05-22 22:41 化的了
@Nicholas.Yuen
netbeans的插件,eclipse的UML2也可以生成UML图,但用用起来不够人性化  回复  更多评论
  

# re: 简单工厂 Simple Factory 2008-05-30 10:49 大卫
很好的文章,通俗易懂。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: