設計模式 3/23 抽象工廠模式

我看了不少的帖子,設計模式幾乎是園子裏的月經貼,每隔一段時間總有人來分享一下本身的學習心得,或爲記錄本身所學,或爲換着方式分享與你們。但大多直接上來就是給代碼,給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 + "製造出來了");
        }
    }
View Code

而後咱們來建立一個超級工廠

    /// <summary>
    /// 超級工廠
    /// </summary>
    public interface IFactory
    {
        /// <summary>
        /// 請生產64位IPhone
        /// </summary>
        /// <returns></returns>
        IPhone64G CreatePhone64G();

        /// <summary>
        /// 請生產32位IPhone
        /// </summary>
        /// <returns></returns>
        IPhone32G CreatePhone32G();
    }
View Code

而後咱們分別建立富士康和比亞迪

富士康

    /// <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;
        }
    }
View Code

比亞迪

    /// <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;
        }
    }
View Code

以上,咱們的抽象工廠模式就完成了,咱們來看看怎麼調用

  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();
        }
View Code

結果以下

總結下

優勢

1.咱們有超級工廠,咱們隔離了具體類的生產

2.既然有1,那咱們就容易改變產品的系列,後續要增長IPhone128G, IPhone7,8,9就很容易

缺點

增長產品的時候雖說咱們很容易,可是別忘記了,咱們須要修改超級工廠的定義,同時還要在具體的工廠裏面加代碼

 

不要沉迷與怎麼把代碼修改成抽象工廠模式,理解其爲何,是什麼,最後去想怎麼用

以上就是關於抽象工廠設計模式的分享

相關文章
相關標籤/搜索