設計一個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行,出現(xiàn)了if...else if...,當又有新的Pizza品種時,顯然這個createPizza函數(shù)免不了再加一個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的實質就是:
問題:可能根據(jù)不同條件返回同一種類型的不同結果,且該條件在不斷的變化中,我們需要封裝這種變化。(不僅僅是encapsulate object creation)
結論:寫一個專門的類,該類中的一個方法來實現(xiàn)上面的條件判斷。