簡(jiǎn)單工廠模式
類圖
通過一個(gè)工廠類,以一個(gè)條件來創(chuàng)建對(duì)應(yīng)的對(duì)象
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
|
//業(yè)務(wù)功能 public interface ICalculation { double getResult( double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult( double numA, double numB) { System.out.println( "加法" ); return numA + numB; } } public class CalcSubtract implements ICalculation { @Override public double getResult( double numA, double numB) { System.out.println( "減法" ); return numA - numB; } } /* * 簡(jiǎn)單工廠模式 關(guān)注:對(duì)象的創(chuàng)建 * 建立一個(gè)工廠類,對(duì)實(shí)現(xiàn)了同一接口的或者是存在繼承關(guān)系的一些類進(jìn)行實(shí)例的創(chuàng)建 */ public class Test4Simple { public static void main(String[] args) { // String operation = "/"; String operation = "+" ; // String operation = "-"; // String operation = "*"; double numA = 182 , numB = 33 ; ICalculation createCalc = CalcSimpleFactory.createCalc(operation); double result = createCalc.getResult(numA, numB); System.out.println(result); } } |
簡(jiǎn)單工廠的缺陷: 簡(jiǎn)單工廠創(chuàng)建產(chǎn)品時(shí)需要傳遞相應(yīng)的參數(shù),如果傳遞不正確就取不到對(duì)象了。
改進(jìn):多方法創(chuàng)建不同產(chǎn)品
類圖
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
|
public class CalcMultipleFactory { public static ICalculation produceAdd() { return new CalcAdd(); } public static ICalculation produceSubtract() { return new CalcSubtract(); } public static ICalculation produceMultiply() { return new CalcMultiply(); } public static ICalculation produceDivide() { return new CalcDivide(); } } public class Test4Multiple { public static void main(String[] args) { double numA = 182 , numB = 33 ; ICalculation createCalc = CalcMultipleFactory.produceAdd(); double result = createCalc.getResult(numA, numB); System.out.println(result); createCalc = CalcMultipleFactory.produceSubtract(); result = createCalc.getResult(numA, numB); System.out.println(result); createCalc = CalcMultipleFactory.produceMultiply(); result = createCalc.getResult(numA, numB); System.out.println(result); createCalc = CalcMultipleFactory.produceDivide(); result = createCalc.getResult(numA, numB); System.out.println(result); } } |
抽象工廠模式
里面有幾個(gè)概念:抽象工廠、實(shí)體工廠、抽象產(chǎn)品、實(shí)體產(chǎn)品
抽象工廠:定義創(chuàng)建產(chǎn)品的抽象方法
實(shí)體工廠:具體的創(chuàng)建哪種產(chǎn)品
抽象產(chǎn)品:一個(gè)接口或基類
實(shí)體產(chǎn)品:實(shí)現(xiàn)具體功能,或派生
類圖
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
//抽象產(chǎn)品1 public interface IProduct1 { public void show(); } //抽象產(chǎn)品2 public interface IProduct2 { public void show(); } //實(shí)體產(chǎn)品1 public class Product1 implements IProduct1 { public void show() { System.out.println( "創(chuàng)建了1型產(chǎn)品" ); } } //實(shí)體產(chǎn)品2 public class Product2 implements IProduct2 { public void show() { System.out.println( "創(chuàng)建了2型產(chǎn)品" ); } } /* * 1A 1B屬于Product1 同一產(chǎn)品等級(jí)結(jié)構(gòu)中 * 2A 2B屬于Product2 */ public class GradeProduct1A extends Product1 { @Override public void show() { super.show(); System.out.println("這是產(chǎn)品1下的:產(chǎn)品A"); } } public class GradeProduct1B extends Product1 { @Override public void show() { super.show(); System.out.println("這是產(chǎn)品1下的:產(chǎn)品B"); } } public class GradeProduct2A extends Product2 { @Override public void show() { super.show(); System.out.println("這是產(chǎn)品2下的:產(chǎn)品A"); } } public class GradeProduct2B extends Product2 { @Override public void show() { super.show(); System.out.println("這是產(chǎn)品2下的:產(chǎn)品B"); } } //抽象工廠 創(chuàng)建不同的抽象產(chǎn)品 public interface IFactory { public IProduct1 createProduct1A();//1類產(chǎn)品 型號(hào)A public IProduct1 createProduct1B();//1類產(chǎn)品 型號(hào)B public IProduct2 createProduct2A();//2類產(chǎn)品 型號(hào)A public IProduct2 createProduct2B();//2類產(chǎn)品 型號(hào)B } //實(shí)體工廠 創(chuàng)建實(shí)體產(chǎn)品,返回類型為抽象產(chǎn)品 public class Factory implements IFactory { public IProduct1 createProduct1A() { return new GradeProduct1A(); } public IProduct1 createProduct1B() { return new GradeProduct1B(); } public IProduct2 createProduct2A() { return new GradeProduct2A(); } public IProduct2 createProduct2B() { return new GradeProduct2B(); } } /* * 抽象工廠模式:用來創(chuàng)建一組相關(guān)或者相互依賴的對(duì)象 * * 流程:抽象工廠,實(shí)體工廠 生產(chǎn)產(chǎn)品 * 抽象產(chǎn)品,實(shí)體產(chǎn)品 實(shí)現(xiàn)產(chǎn)品功能 * 缺點(diǎn):當(dāng)需要增加一個(gè)產(chǎn)品(由抽象和實(shí)體構(gòu)成),工廠都需要更改 */ public class Test4Abstract { public static void main(String[] args) { IFactory factory = new Factory(); IProduct1 product1a = factory.createProduct1A(); product1a.show(); IProduct1 product1b = factory.createProduct1B(); product1b.show(); IProduct2 product2a = factory.createProduct2A(); product2a.show(); IProduct2 product2b = factory.createProduct2B(); product2b.show(); } } |