【設計模式】C#設計模式:抽象工廠模式

【設計模式】面向對象設計七大原則
【設計模式】設計模式概念和分類
【設計模式】C#設計模式:單例模式
【設計模式】C#設計模式:工廠方法模式
【設計模式】C#設計模式:抽象工廠模式

模式定義

抽象工廠模式(Abstract Factory Pattern):提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。

抽象工廠模式包含如下角色:
• AbstractFactory:抽象工廠
• ConcreteFactory:具體工廠
• AbstractProduct:抽象產品
• Product:具體產品

模式分析

抽象工廠模式是所有形式的工廠模式中最爲抽象和最具一般性的一種形態。
抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構,一個工廠等級結構可以負責多個不同產品等級結構中的產品對象的創建 。當一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有對象時,抽象工廠模式比工廠方法模式更爲簡單、有效率。

public enum PhoneBrand
{
	HUAWEI,
	MI,
	OPPO,
	VIVO,
}

/// <summary>
/// 手機抽象產品
/// </summary>
public class MobilePhone
{
	public virtual void SendMessage() { Debug.Log("MobilePhone Hello"); }
	public virtual void Telephone() { }
}

/// <summary>
/// 手機具體產品
/// </summary>
public class PhoneHUAWEI: MobilePhone
{
	public override void SendMessage()
	{
		Debug.Log("HUAWEI Hello");
	}
}

public class PhoneOPPO : MobilePhone
{
	public override void SendMessage()
	{
		Debug.Log("PhoneOPPO Hello");
	}
}

/// <summary>
/// 電腦抽象產品
/// </summary>
public class Computer
{
	public virtual void PlayGame() { Debug.Log("Computer Play Game"); }
}

public class ComputerHUAWEI: Computer
{
	public override void PlayGame() { Debug.Log("ComputerHUAWEI Play Game"); }
}

public class ComputerOPPO : Computer
{
	public override void PlayGame() { Debug.Log("ComputerOPPO Play Game"); }
}


/// <summary>
/// 抽象生產工廠
/// </summary>
public abstract class ProductFoundries
{
	public abstract MobilePhone PhoneProduct();
	public abstract Computer ComputerProduct();
}

/// <summary>
/// HUAWEI生產工廠
/// </summary>
public class FoundriesHUAWEI : ProductFoundries
{
	public override MobilePhone PhoneProduct()
	{
		return new PhoneHUAWEI();
	}

	public override Computer ComputerProduct()
	{
		return new ComputerHUAWEI();
	}
}

/// <summary>
/// OPPO生產工廠
/// </summary>
public class FoundriesOPPO : ProductFoundries
{
	public override MobilePhone PhoneProduct()
	{
		return new PhoneOPPO();
	}

	public override Computer ComputerProduct()
	{
		return new ComputerOPPO();
	}
}

/// <summary>
/// 工廠使用案列
/// </summary>
public class Employ
{
	List<PhoneBrand> phoneBrands;

	/// <summary>
	/// 下訂單
	/// </summary>
	public void PlaceAnOrder()
	{
		phoneBrands = new List<PhoneBrand>();
		phoneBrands.Add(PhoneBrand.HUAWEI);
		phoneBrands.Add(PhoneBrand.OPPO);
		ProductionOrder(phoneBrands);
	}

	/// <summary>
	/// 產品生產訂單
	/// </summary>
	public void ProductionOrder(List<PhoneBrand> phoneBrands)
	{
		ProductFoundries foundries;
		MobilePhone mobile;
		Computer computer;

		for (int i = 0; i < phoneBrands.Count; i++)
		{
			switch (phoneBrands[i])
			{
				case PhoneBrand.HUAWEI:
					foundries = new FoundriesHUAWEI();
					break;
				case PhoneBrand.OPPO:
					foundries = new FoundriesOPPO();
					break;
				default:
					continue;
			}
			mobile = foundries.PhoneProduct();
			mobile.SendMessage();// 生產手機發送短信
			computer = foundries.ComputerProduct();
			computer.PlayGame();// 生產電腦打遊戲
		}
		phoneBrands.Clear();
		phoneBrands = null;
	}
}

模式優點

(1)抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被創建。由於這種隔離,更換一個具體工廠就變得相對容易。所有的具體工廠都實現了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統的行爲。另外,應用抽象工廠模式可以實現高內聚低耦合的設計目的,因此抽象工廠模式得到了廣泛的應用。
(2)當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象。這對一些需要根據當前環境來決定其行爲的軟件系統來說,是一種非常實用的設計模式。
(3)增加新的具體工廠和產品族很方便,無須修改已有系統,符合“開閉原則”。

模式缺點

(1)在添加新的產品對象時,難以擴展抽象工廠來生產新種類的產品,這是因爲在抽象工廠角色中規定了所有可能被創建的產品集合,要支持新種類的產品就意味着要對該接口進行擴展,而這將涉及到對抽象工廠角色及其所有子類的修改,顯然會帶來較大的不便。
(2)開閉原則的傾斜性(增加新的工廠和產品族容易,增加新的產品等級結構麻煩)

模式適用環境

在以下情況下可以使用抽象工廠模式:
(1)一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有類型的工廠模式都是重要的。
(2)系統中有多於一個的產品族,而每次只使用其中某一產品族。
(3)屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
(4)系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。

“開閉原則”的傾斜性

“開閉原則”要求系統對擴展開放,對修改封閉,通過擴展達到增強其功能的目的。對於涉及到多個產品族與多個產品等級結構的系統,其功能增強包括兩方面:
(1) 增加產品族:對於增加新的產品族,工廠方法模式很好的支持了“開閉原則”,對於新增加的產品族,只需要對應增加一個新的具體工廠即可,對已有代碼無須做任何修改。
(2) 增加新的產品等級結構:對於增加新的產品等級結構,需要修改所有的工廠角色,包括抽象工廠類,在所有的工廠類中都需要增加生產新產品的方法,不能很好地支持“開閉原則”。

抽象工廠模式的這種性質稱爲“開閉原則”的傾斜性,抽象工廠模式以一種傾斜的方式支持增加新的產品,它爲新產品族的增加提供方便,但不能爲新的產品等級結構的增加提供這樣的方便。

工廠模式的退化

當抽象工廠模式中每一個具體工廠類只創建一個產品對象,也就是隻存在一個產品等級結構時,抽象工廠模式退化成工廠方法模式;當工廠方法模式中抽象工廠與具體工廠合併,提供一個統一的工廠來創建產品對象,並將創建對象的工廠方法設計爲靜態方法時,工廠方法模式退化成簡單工廠模式。

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