04-抽象工廠模式

抽象工廠模式

一、定義

爲創建一組相關或相互依賴的對象提供一個接口,而且無需指定它們的具體類

抽象工廠方法的通用類圖如下
在這裏插入圖片描述
抽象工廠模式是工廠方法模式的升級版本,應用於多個業務品種、業務分類產生對象的情況。

下面爲通用源代碼類圖與其代碼

通用源代碼類圖
在這裏插入圖片描述
有兩個相互影響的產品線(產品族,即不同的產品,如汽車發動機和方向盤)ProductA、ProductB

,每個產品有連個登記,ProductX1、ProductX2,有2個工廠類Creator1、Creator2用於創建來個等級的產品,Creator1生產

抽象產品類ProductA1、ProductB1,所以Creator1依賴ProductA1、ProductB1,Creator2同樣。

通用源碼

public abstract class AbstractProductA {
	//每個產品共有的方法
	public void shareMethod(){
	}
	//每個產品相同方法,不同實現
	public abstract void doSomething();
}

產品A1的實現類

public class ProductA1 extends AbstractProductA {
	public void doSomething() {
		System.out.println("產品A1的實現方法");
	}
}

產品A2的實現方式

public class ProductA2 extends AbstractProductA {
	public void doSomething() {
		System.out.println("產品A2的實現方法");
	}
}

產品B與A類似

抽象工廠類AbstractCreator的職責是定義每個工廠要實現的功能

public abstract class AbstractCreator {
	//創建A產品家族
	public abstract AbstractProductA createProductA();
	//創建B產品家族
	public abstract AbstractProductB createProductB();
}

等級爲1的工廠類

public class Creator1 extends AbstractCreator {
	//只生產產品等級爲1的A產品
	public AbstractProductA createProductA() {
		return new ProductA1();
	}
	//只生產產品等級爲1的B產品
	public AbstractProductB createProductB() {
		return new ProductB1();
	}
}

等級爲2的工廠類

public class Creator2 extends AbstractCreator {
	//只生產產品等級爲2的A產品
	public AbstractProductA createProductA() {
		return new ProductA2();
	}
	//只生產產品等級爲2的B產品
	public AbstractProductB createProductB() {
		return new ProductB2();
	}
}

與實現無關的場景類Client

public class Client {
	public static void main(String[] args) {
		//定義出兩個工廠
		AbstractCreator creator1 = new Creator1();
		AbstractCreator creator2 = new Creator2();
		//產生A1對象
		AbstractProductA a1 = creator1.createProductA();
		//產生A2對象
		AbstractProductA a2 = creator2.createProductA();
		//產生B1對象
		AbstractProductB b1 = creator1.createProductB();
		//產生B2對象
		AbstractProductB b2 = creator2.createProductB();
		/*
		* 然後在這裏就可以爲所欲爲了...
		*/
	}
}

在場景類中,沒有任何一個方法與實現類有關係,我們只要知道它的工廠方法就可以直接產生一個產品對象,無須關心它的實現類。

二、抽象工廠的優點

  • 封裝性

    高層模塊不需要關心每個產品的實現類,只要知道哪個工廠類能創建出一個需要的對象即可

  • 產品族內的約束爲非公開狀態

    例如一個發動機對應一個方向盤,但需要對應四個輪子,具體的產品族內的約束是在工廠內實現的。

三、抽象工廠的缺點

  • 產品族擴展困難

    如上面要增加一個產品C,則需要在抽象類AbstractCreator增加一個createProductC(),然後兩個工廠實現類都需要修改,所有與契約有關係的代碼都要修改。

    其實上面與現實相似,比如說一個工廠有兩個電腦生產工廠,生產電腦外殼和電池,現在老闆要擴展生產線,生產電腦藍牙設備,那麼每個工廠都要添加生產藍牙設備的車間(生產方法),這樣一個工廠產出的物品纔是完整地(在一個工廠需要產出組合完整地產品的前提下)

四、使用場景

一個對象族都有相同的約束,就可以使用抽象工廠模式。

生產工廠,生產電腦外殼和電池,現在老闆要擴展生產線,生產電腦藍牙設備,那麼每個工廠都要添加生產藍牙設備的車間(生產方法),這樣一個工廠產出的物品纔是完整地(在一個工廠需要產出組合完整地產品的前提下)

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