設計模式之抽象工廠模式(3)

 抽象工廠模式
在工廠方法模式中具體工廠負責生產具體的產品, 每一個具體工廠對應一種具體產品但是有
時候我們希望一個工廠可以提供多個產品對象, 而不是單一的產品對象, 如一個電器工廠,
它可以生產電視機、 電冰箱、 空調等多種電器, 而不是隻生產某一種電器。 爲了更好地理解
抽象工廠模式, 我們先引入兩個概念:

(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個具體工廠

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章