抽象工廠
Prerequisites:
在簡單工廠模式中,使用工廠生產各個種類的Pizza。
若今天在各個國家都有工廠,根據不同國家生產符合他們口味的Pizza,請問要怎麼改?
假設現在有台灣Pizza工廠、日本Pizza工廠
台灣工廠的口味是珍珠奶茶Pizza、臭豆腐Pizza
日本工廠的口味是章魚燒Pizza、大阪燒Pizza
首先要先建立的抽象工廠,裡面有一個createPizza()方法,由各個工廠去覆寫。
Pizza抽象類別,下面有各種口味的Pizza。
還有一個訂購Pizza的類別
如下圖:
工廠相關程式碼
1
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
32
33
public abstract class AbsFactory {
public abstract Pizza createPizza(String pizzaType);
}
public class TWFactory extends AbsFactory{
@Override
public Pizza createPizza(String pizzaType) {
Pizza pizza = null;
if (pizzaType.equals("tofu")) {
pizza = new TofuPizza();
pizza.setName("臭豆腐pizza");
} else if (pizzaType.equals("bubble")) {
pizza = new BubblePizza();
pizza.setName("珍珠奶茶pizza");
}
return pizza;
}
}
public class JAPFactory extends AbsFactory{
@Override
public Pizza createPizza(String pizzaType) {
Pizza pizza = null;
if (pizzaType.equals("taco")) {
pizza = new TacoPizza();
pizza.setName("章魚燒pizza");
} else if (pizzaType.equals("oko")) {
pizza = new BubblePizza();
pizza.setName("大阪燒pizza");
}
return pizza;
}
}
Pizza相關程式碼
1
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public abstract class Pizza {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
// 不同的pizza準備的材料不同,由不同的pizza去覆寫
public abstract void prepare();
// 相同的作法就統一寫
public void bake() {
System.out.println("放進烤箱");
}
public void cut() {
System.out.println("把pizza切片");
}
public void box() {
System.out.println("pizza裝進盒子");
}
}
public class BubblePizza extends Pizza{
@Override
public void prepare() {
System.out.println(getName() + "有:珍珠");
}
}
public class TofuPizza extends Pizza{
@Override
public void prepare() {
System.out.println(getName() + "有:臭豆腐");
}
}
public class TacoPizza extends Pizza{
@Override
public void prepare() {
System.out.println(getName() + "有:章魚燒");
}
}
public class OkoPizza extends Pizza{
@Override
public void prepare() {
System.out.println(getName() + "有:高麗菜");
}
}
訂購相關
1
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
32
33
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class OrderPizza {
private AbsFactory factory;
public void setFactory(AbsFactory factory) {
this.factory = factory;
}
public void order() {
Pizza pizza = null;
String pizzaType;
do {
pizzaType = getType();
pizza = factory.createPizza(pizzaType);
if (pizza == null) break;
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
main主程式
1
2
3
4
5
6
7
public class Test {
public static void main(String[] args) {
OrderPizza orderPizza = new OrderPizza();
orderPizza.setFactory(new JAPFactory());
orderPizza.order();
}
}
input pizza type:
oko
大阪燒pizza有:珍珠
放進烤箱
把pizza切片
pizza裝進盒子
input pizza type:
taco
章魚燒pizza有:章魚燒
放進烤箱
把pizza切片
pizza裝進盒子