前面介紹了單例模式及工廠模式相關知識及示例,今天主要介紹的是抽象工廠模式,上一篇咱們講了工廠模式。將建立對象的任務委託給子類,延遲建立。解決工廠中責任的劃分。實現具體工廠與產品之間的一一對應。解決的是」單個對象」的問題。html
華爲工廠除了生產華爲手機以外。確定也會有原件配套的充電線和耳機。這時工廠對應的是一套產品該如何解決了呢?顯然再也不適合使用工廠模式了。今天將的抽象工廠模式將會比較好的解決此問題。抽象工廠模式解決的是」一系列對象」的問題、解決多套變化的問題。編程
在咱們編程的過程當中不免會出現」一系列相互依賴對象」的建立問題,每每會有因爲須要的改變增長或減小對象的建立。爲了面對解決這種」一系列的相互依賴的對象」的建立工做的緊密耦合性,出現了其解決方案——抽象工廠模式。設計模式
提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。ide
工廠模式:學習
一、解決」單個對象」的問題spa
二、工廠類與產品類一一對應關係設計
抽象工廠模式:code
一、解決」一系列對象」的問題htm
二、工廠類與產品類是一對多的關係(一對應一系列想依賴的產品)對象
工廠模式講的是一個華爲手機工廠生產一個華爲手機,要生產其餘的產品需另加工廠。抽象工廠模式講的是一個華爲手機工廠能夠生產一系列的華爲手機產品(手機、耳機、充電器)。
根據上一篇文章的事例咱們進行擴展,進一步講述抽象工廠模式的使用。抽象工廠模式咱們工廠類對應的多個產品的生產。華爲手機工廠生產華爲手機、華爲耳機、華爲充電器等。下面咱們看看抽象工廠模式的具體實現:
namespace Abstract_Factory { #region 抽象產品類 ===============
/// <summary>
/// 手機抽象類 /// </summary>
public abstract class Phone { public abstract string CreatePhone(); } /// <summary>
/// 耳機抽象類 /// </summary>
public abstract class Headset { public abstract string CreateHeadset(); } /// <summary>
/// 充電器抽象類 /// </summary>
public abstract class Charger { public abstract string CreateCharger(); } #endregion
#region 華爲具體產品類 ===========
public class HuaweiPhone : Phone { public override string CreatePhone() { return "華爲手機一號現世"; } } public class HuaweiHeadset : Headset { public override string CreateHeadset() { return "華爲手機一號原配耳機"; } } public class HuaweiCharger : Charger { public override string CreateCharger() { return "華爲手機一號原配充電器"; } } #endregion
#region 小米具體產品類 ===========
public class XiaomiPhone : Phone { public override string CreatePhone() { return "小米手機一號現世"; } } public class XiaomiHeadset : Headset { public override string CreateHeadset() { return "小米手機一號原配耳機"; } } public class XiaomiCharger : Charger { public override string CreateCharger() { return "小米手機一號原配充電器"; } } #endregion
#region 抽象工廠類 ===============
/// <summary>
/// 抽象工廠類 /// </summary>
public abstract class AbstractFactory { public abstract Phone GetPhone(); public abstract Headset GetHeadset(); public abstract Charger GetCharger(); } #endregion
#region 華爲具體工廠===============
public class HuaweiFactory : AbstractFactory { public override Phone GetPhone() { return new HuaweiPhone(); } public override Headset GetHeadset() { return new HuaweiHeadset(); } public override Charger GetCharger() { return new HuaweiCharger(); } } #endregion
#region 小米具體工廠===============
public class XiaomiFactory : AbstractFactory { public override Phone GetPhone() { return new XiaomiPhone(); } public override Headset GetHeadset() { return new XiaomiHeadset(); } public override Charger GetCharger() { return new XiaomiCharger(); } } #endregion }
class Program { static void Main(string[] args) { ///華爲工廠生產華爲產品
HuaweiFactory huaweiFactory = new HuaweiFactory(); var phone = huaweiFactory.GetPhone().CreatePhone(); var headset = huaweiFactory.GetHeadset().CreateHeadset(); var charger = huaweiFactory.GetCharger().CreateCharger(); Console.WriteLine("華爲產品生產:" + phone + "——" + headset + "——" + charger); ///小米工廠生產小米產品
XiaomiFactory xiaomiFactory = new XiaomiFactory(); phone = xiaomiFactory.GetPhone().CreatePhone(); headset = xiaomiFactory.GetHeadset().CreateHeadset(); charger = xiaomiFactory.GetCharger().CreateCharger(); Console.WriteLine("小米產品生產:" + phone + "——" + headset + "——" + charger); Console.ReadLine(); } }
這是系列產品新增了一個魅族手機,咱們看看如何修改增長魅族手機的生產:
#region 新增魅族手機需求===========
public class MeizuPhone : Phone { public override string CreatePhone() { return "魅族手機一號現世"; } } public class MeizuHeadset : Headset { public override string CreateHeadset() { return "魅族手機一號原配耳機"; } } public class MeizuCharger : Charger { public override string CreateCharger() { return "魅族手機一號原配充電器"; } } public class MeizuFactory : AbstractFactory { public override Phone GetPhone() { return new MeizuPhone(); } public override Headset GetHeadset() { return new MeizuHeadset(); } public override Charger GetCharger() { return new MeizuCharger(); } } #endregion
///魅族工廠生產小米產品
MeizuFactory meizuFactory = new MeizuFactory(); phone = meizuFactory.GetPhone().CreatePhone(); headset = meizuFactory.GetHeadset().CreateHeadset(); charger = meizuFactory.GetCharger().CreateCharger(); Console.WriteLine("魅族產品生產:" + phone + "——" + headset + "——" + charger);
這裏咱們能夠發現新增系列產品(魅族系列)比較方便,並且吻合」開放擴展——封閉修改」的原則。擴展起來仍是比較方便的,可是也是存在着必定的問題的。當咱們新增新的產品的時候,這個時候就須要去系列產品生產抽象工廠去增長產品的生產方法。同時也須要在各個子類中增長其方法。這也就違背了開閉原則。這也就是抽象方法的一個缺點所在。
一、在系統中若是存在一系列相互依賴的產品。這系列變化比較多。且存在着多套系列的產品的時候。咱們就能夠考慮使用抽象工廠模式了。
二、強調一系列相關的產品對象設計的時候。
三、一個系統由多個相互依賴項進行配置且須要多個系統時。
一、當一個產品系列,對個對象使用時,保證使用的是同系列中的對象
二、下降了具體產品和具體類及客戶端之間的耦合性。經過使用抽象類相關聯而不是具體類。
三、對系列產品的修改增長極其方便
一、在系列產品中新增產品困難而且違反了開閉原則
到這裏抽象工廠模式咱們就暫時的介紹完了。今天呢又介紹了建立型中的一種設計模式,設計模式的學習之路還很漫長。一切都纔剛剛開始。學習更重要的是靈活運用,觸類旁通。選擇適當的場景去使用適當的模式。多思考其優勢缺點和使用場景。抽象工廠在針對於系列產品的修改增長時符合開閉原則。可是在系列產品中的產品修改增長的時候又違反了開閉原則。咱們在使用每一種設計模式時都得慎重選擇。
只要認爲是對的就去作,堅持去作,不要在意別人的見解,哪怕是錯,至少你有去作過證實曾經你努力過。
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!