我看了不少的帖子,設計模式幾乎是園子裏的月經貼,每隔一段時間總有人來分享一下本身的學習心得,或爲記錄本身所學,或爲換着方式分享與你們。但大多直接上來就是給代碼,給UML圖,給類圖,其實這種是快,但不少工做經驗少的同窗,幾乎沒法體會其中的所含的內容,更沒法在平常工做中運用所學,提高系統框架,功能的設計開發能力。設計模式
我但願能經過足夠簡單的文字,讓你們去體會到前人們所總結出來的設計模式框架
世間本無設計模式,用的人多了,天然就有了iphone
前面兩張根據漸進明細的原則,逐步的從簡單工廠模式走到工廠模式,今天介紹工廠的終極形態,抽象工廠ide
不要被終極形態所迷惑,我只是爲了增長層層遞進的效果學習
抽象工廠模式(Abstract Factory Pattern),提供一個建立一系列相關或相互依賴的接口,而無需指定它們具體的類spa
我就問還有誰,還有誰能第一眼看明白,理解透徹,知道是什麼意思,站出來,算你輸設計
老規矩,看黑板,畫重點3d
2個點code
1.抽象,工廠, 這是一個動賓結果,抽象是動詞,幹嗎呢,抽象->工廠,對工廠進行抽象,咱們對類進行抽象能夠獲得抽象類,抽象類什麼概念??blog
看上去不一樣,可是本質上相同的具體概念的抽象,咱們稱爲抽象類
你能夠認爲抽象類是一個超級基類
那同理
抽象工廠,咱們用形容詞+名詞結構來解釋,抽象的工廠,那就是一個超級工廠。
超級工廠就是其餘工廠的工廠,圍繞超級工廠建立其餘工廠
2.無需制定它們具體的類
咱們的工廠負責生產具體的東西,不須要顯示的告訴他們,你須要生產什麼什麼,你只須要按照咱們超級工廠告訴你的作法去作,你生產出來的東西,就是咱們要的東西
咱們要的東西,超級工廠裏已經告訴你了,等下請細細品味超級工廠,慢慢的體會這句話
咱們舉個例子
Iphone,如今這個星球上人人都不陌生的手機,那Iphone其實還分32G 啦,64G啦等等型號的
在這個星球上,富士康是總所周知的蘋果生產主力廠商,注意,是主力,不是所有
咱們假設,富士康的競爭對手比亞迪,也能生產Iphone
那蘋果公司就會想了,我得分散,我不能所有交給富士康去生產,若是富士康要提價,我尚未其餘選擇麼,我能夠選擇比亞迪來制衡富士康
基於這樣一個案例,咱們看看怎麼用抽象工廠模式來實現
咱們有IPhone,而且有各類不一樣型號的IPhone
/// <summary> /// 我是IPhone 抽象類 /// </summary> public abstract class IPhone { /// <summary> /// 生產廠商名稱 /// </summary> public abstract string FactoryName { get; set; } /// <summary> /// 手機的說明書 /// </summary> public abstract void Instructions(); } /// <summary> /// 64G的 IPhone /// </summary> public class IPhone64G : IPhone { public override string FactoryName { get; set; } public override void Instructions() { Console.WriteLine("我是64G的IPhone,我被" + FactoryName + "製造出來了"); } } /// <summary> /// 32G的 IPhone /// </summary> public class IPhone32G : IPhone { public override string FactoryName { get; set; } public override void Instructions() { Console.WriteLine("我是32G的IPhone,我被" + FactoryName + "製造出來了"); } }
而後咱們來建立一個超級工廠
/// <summary> /// 超級工廠 /// </summary> public interface IFactory { /// <summary> /// 請生產64位IPhone /// </summary> /// <returns></returns> IPhone64G CreatePhone64G(); /// <summary> /// 請生產32位IPhone /// </summary> /// <returns></returns> IPhone32G CreatePhone32G(); }
而後咱們分別建立富士康和比亞迪
富士康
/// <summary> /// 富士康 /// </summary> public class FoxconnFactory : IFactory { private string FactoryName = "Foxconn"; /// <summary> /// 生產64位IPhone /// </summary> /// <returns></returns> public IPhone64G CreatePhone64G() { var iphone64G = new IPhone64G() { FactoryName = FactoryName }; return iphone64G; } /// <summary> /// 生產32位IPhone /// </summary> /// <returns></returns> public IPhone32G CreatePhone32G() { var iphone32G = new IPhone32G() { FactoryName = FactoryName }; return iphone32G; } }
比亞迪
/// <summary> /// 比亞迪 /// </summary> public class BydFactory : IFactory { private string FactoryName = "BYD"; /// <summary> /// 生產64位IPhone /// </summary> /// <returns></returns> public IPhone64G CreatePhone64G() { var iphone64G = new IPhone64G() { FactoryName = FactoryName }; return iphone64G; } /// <summary> /// 生產32位IPhone /// </summary> /// <returns></returns> public IPhone32G CreatePhone32G() { var iphone32G = new IPhone32G() { FactoryName = FactoryName }; return iphone32G; } }
以上,咱們的抽象工廠模式就完成了,咱們來看看怎麼調用
static void Main() { IFactory factory = new FoxconnFactory(); var iphone64G = factory.CreatePhone64G(); iphone64G.Instructions(); var iphone32G = factory.CreatePhone32G(); iphone32G.Instructions(); IFactory factory2 = new BydFactory(); var iphone64G2 = factory2.CreatePhone64G(); iphone64G2.Instructions(); var iphone32G2 = factory2.CreatePhone32G(); iphone32G2.Instructions(); Console.ReadLine(); }
結果以下
總結下
優勢
1.咱們有超級工廠,咱們隔離了具體類的生產
2.既然有1,那咱們就容易改變產品的系列,後續要增長IPhone128G, IPhone7,8,9就很容易
缺點
增長產品的時候雖說咱們很容易,可是別忘記了,咱們須要修改超級工廠的定義,同時還要在具體的工廠裏面加代碼
不要沉迷與怎麼把代碼修改成抽象工廠模式,理解其爲何,是什麼,最後去想怎麼用
以上就是關於抽象工廠設計模式的分享