Factory Methord的目的就是在“封裝對象的創建”的基礎上(simple factory, factory methord, abstract factory的前提都是封裝對象的創建),讓子類來決定對象被如何創建。對比simple factory 是用一個與之assciation的新造的類來專門決定對象該如何被創建,具體見前文《簡單工廠》。
仍然是用PizzaStore為例:注意下面的PizzaStore中的createPizza()方法是抽象方法,執行過程有子類來決定!而PizzaStore也因此而是抽象類。

通過NYPizzaStore來創建一個NYCheesePizza的時序圖如下:

具體代碼如下:
事實上,所謂的Factory Methord講白了就是:有些事情,父類故意不干事,讓給子類去干。
簡化的UML如下:

仍然是用PizzaStore為例:注意下面的PizzaStore中的createPizza()方法是抽象方法,執行過程有子類來決定!而PizzaStore也因此而是抽象類。

通過NYPizzaStore來創建一個NYCheesePizza的時序圖如下:

具體代碼如下:
1
package javaapplication18;
2
3
public class Main
4
{
5
6
public static void main(String[] args)
7
{
8
PiszzaStore store = new NYPizzaStore();
9
store.createPizza("CheesePizza");
10
store.orderPizza();
11
}
12
}
13

2

3

4

5

6

7

8

9

10

11

12

13

1
package javaapplication18;
2
3
public abstract class PiszzaStore
4
{
5
6
Pizza mPizza;
7
8
public PiszzaStore()
9
{
10
}
11
12
public abstract Pizza createPizza(String pizzaName);
13
14
public Pizza orderPizza()
15
{
16
mPizza.prepare();
17
mPizza.bake();
18
mPizza.cut();
19
mPizza.box();
20
return mPizza;
21
}
22
}
23
24

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

1
package javaapplication18;
2
3
public class NYPizzaStore extends PiszzaStore
4
{
5
6
public NYPizzaStore()
7
{
8
}
9
10
public Pizza createPizza(String pizzaName)
11
{
12
if (pizzaName.equals("CheesePizza"))
13
{
14
mPizza = new NYCheesePizza();
15
System.out.println("NY CheesePizza created.");
16
return mPizza;
17
}
18
else if (pizzaName.equals("ClamPizza"))
19
{
20
mPizza = new NYClamPizza();
21
System.out.println("NY ClamPizza created.");
22
return mPizza;
23
}
24
return null;
25
}
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 javaapplication18;
2
3
public class Pizza
4
{
5
6
public Pizza()
7
{
8
}
9
10
public void prepare()
11
{
12
System.out.println("pizza prepared");
13
}
14
15
public void bake()
16
{
17
System.out.println("pizza baked");
18
}
19
20
public void cut()
21
{
22
System.out.println("pizza cut");
23
}
24
25
public void box()
26
{
27
System.out.println("pizza boxed");
28
}
29
}
30
31

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

29

30

31

事實上,所謂的Factory Methord講白了就是:有些事情,父類故意不干事,讓給子類去干。
簡化的UML如下:
