緊接著上一篇隨筆介紹Simple Factory,如果我們需要create各種各樣的Pizza,我們可以在PizzaFactory里面的factoryPizzaCreation( )內
寫上無數的if...else if...。當然也可以分門別類,用不同的PizzaFactory構造不同系列的Pizza,如下:
注意:因為XXFactory很多,我們用一個class family來實現它們之間的復用,考慮到調用的時候會有許多if...else if...語句來判斷
具體用哪個XXFactory(來生成Pizza),所以又設計了一個FacFac類,用它的factoryCreation方法來專門生成相應的XXFactory,
這個類相當于“工廠的工廠”。
這樣,FacFac和AbstFactory的子類封裝了變化的部分(前者是封裝XXFactory的變化,后者封裝XXPizza的變化),
其他的類都可以保持穩定。
下面是用NYFactory來生成一個NYCheesePizza的時序圖:

主要實現代碼如下:
1
package SimpleFactory;
2
3
public class PizzaStore
4
{
5
6
AbstFactory mAbstFactory;
7
Pizza mPizza;
8
FacFac mFacfac = new FacFac(); //FacFac是專門用于生產XXPizzaFactory的Factory
9
10
11
public Pizza createPizza(String pizzaName, String pizzaFactory)
12
{
13
14
mAbstFactory = mFacfac.factoryCreation(pizzaFactory);
15
mPizza = mAbstFactory.factoryPizzaCreation(pizzaName);
16
return mPizza;
17
}
18
19
public Pizza orderPizza()
20
{
21
mPizza.prepare();
22
mPizza.bake();
23
mPizza.cut();
24
mPizza.box();
25
return mPizza;
26
}
27
}
28

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28


























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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

1
package SimpleFactory;
2
3
public class Pizza
4
{
5
6
public void prepare()
7
{
8
System.out.println("Pizza prepared");
9
}
10
11
public void bake()
12
{
13
System.out.println("Pizza baked");
14
}
15
16
public void cut()
17
{
18
System.out.println("Pizza cut");
19
}
20
21
public void box()
22
{
23
System.out.println("Pizza boxed.");
24
}
25
}
26

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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("NYClamPizza", "NYFactory");
10
store.orderPizza();
11
}
12
}
13

2

3

4

5

6

7

8

9

10

11

12

13

這個程序,實際上是對簡單工廠思維方式的反復使用。該程序中,設計了兩塊容易產生變化的部分(XXFactory和XXPizza的變化)。
我們對每一部分都使用了簡單工廠的思維——即把變化的部分抽象出來,用一個“工廠類”中的XXCreation方法來單獨實現這段維護時
容易產生變化的代碼。
在簡單工廠中,每抽象一次變化的部分,就在需要保持穩定的類和新增的控制變化的類之間產生了一個Association。