抽象工廠模式
在工廠方法模式中具體工廠負責生產具體的產品, 每一個具體工廠對應一種具體產品但是有
時候我們希望一個工廠可以提供多個產品對象, 而不是單一的產品對象, 如一個電器工廠,
它可以生產電視機、 電冰箱、 空調等多種電器, 而不是隻生產某一種電器。 爲了更好地理解
抽象工廠模式, 我們先引入兩個概念:
(1) 產品等級結構: 產品等級結構即產品的繼承結構, 如一個抽象類是電視機, 其子類有海爾
電視機、 海信電視機、 TCL電視機, 則抽象電視機與具體品牌的電視機之間構成了一個產品等
級結構, 抽象電視機是父類, 而具體品牌的電視機是其子類。
(2) 產品族: 在抽象工廠模式中, 產品族是指由同一個工廠生產的, 位於不同產品等級結構中
的一組產品, 如海爾電器工廠生產的海爾電視機、 海爾電冰箱, 海爾電視機位於電視機產品
等級結構中, 海爾電冰箱位於電冰箱產品等級結構中, 海爾電視機、 海爾電冰箱構成了一個
產品族。
通過一個代碼案例來學習下抽象工廠模式:
一:先用工廠方法模式實現下
1.1抽象產品
//抽象產品
public interface Button {
void display();
}
//抽象產品
public interface TextField {
void display();
}
1.2具體產品
//具體產品
public class SpringButton implements Button{
@Override
public void display() {
System.out.println("顯示淺綠色按鈕");
}
}
//具體產品
public class SummerButton implements Button{
@Override
public void display() {
System.out.println("顯示淺藍色按鈕");
}
}
1.3抽象工廠
//抽象工廠: 是創建抽象產品的
public interface ButtonFactory {
Button createButton();
}
1.4具體工廠
//具體工廠: 在工廠方法模式下,具體只創建一種產品!
public class SpringButtonFactory implements ButtonFactory{
@Override
public Button createButton() {
return new SpringButton();
}
}
public class SummerButtonFactory implements ButtonFactory{
@Override
public Button createButton() {
return new SummerButton();
}
}
UML類圖:
只寫了Button一系列的,設想如果我突然想加ComboBox(組合框) 了,要麼如果使用“工廠方法模式”,
要得像上面UML類圖一樣寫 1(抽象產品) + 2(具體產品) + 1(抽象工廠) + 2(具體工廠) = 6,也就是說一旦要擴展的話
要寫6個類,這是多麼的麻煩,就只關於這點用工廠方法模式實現就可以說不是很好的實現方式!
二:使用抽象工廠模式
抽象工廠模式像是工廠方法模式的升級版
大致思想差不多:
抽象工廠模式 和 工廠方法模式比較:就是具體工廠不是創建一個具體產品,而是創建一個產品族的產品
工廠方法模式:
手機工廠 --》 只是生產手機的(包括小米,apple)
電腦工廠 --》 只是生產電腦的 (包括華碩,apple)
就是一個具體工廠生產一種產品
角色如下:
抽象產品
具體產品
抽象工廠
具體工廠:對應一種產品
抽象工廠模式:
電器工廠 --》 它會生產一系列的電器產品(產品族): 電腦,電視機,冰箱....
就是一個具體工廠生產一種產品族!
抽象產品
具體產品
抽象工廠:抽象工廠就是創建抽象產品的!
具體工廠:對應一種產品族
知道上面的概念後,我們使用“抽象工廠模式”對之前的代碼重構
2.1抽象產品
//抽象產品
public interface Button {
void display();
}
2.2具體產品
//具體產品
public class SpringButton implements Button{
@Override
public void display() {
System.out.println("顯示淺綠色按鈕");
}
}
2.3抽象工廠
//抽象工廠: 在抽象工廠模式中,創建一種產品族
public interface SkinFactory {
Button createButton();
TextField createTextField();
}
2.4具體工廠
public class SpringSkinFactory implements SkinFactory{
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
}
2.5 測試代碼
public class Client {
public static void main(String[] args) {
//抽象工廠
SkinFactory factory;
//抽象產品
Button button;
TextField field;
//具體工廠
factory = new SpringSkinFactory();
//具體產品
button = factory.createButton();
field = factory.createTextField();
button.display();
field.display();
}
}
UML類圖:
如果使用工廠方法模式完成:會產生6個具體工廠
而使用抽象工廠模式完成:會產生2個具體工廠