設計模式 2/23 工廠模式(一)

工廠模式是最經常使用的設計模式之一,用好了,代碼優雅,可維護性高,對系統設計會上一個臺階算法

爲何這麼說,由於工廠模式能夠牽扯出抽象工廠模式,也有你們都會聊到的簡單工廠模式設計模式

咱們要了解一點,23中設計模式中,不包含簡單工廠模式,之因此你們會去聊這個,四個字,漸進明細ide

經過對簡單工廠模式的瞭解,咱們引入工廠這個詞,否則一個寫代碼的,每天給他講工廠,工廠,工廠,西廠,東廠,會暈函數

同時,經過逐步的深刻,從簡單工廠,到工廠模式,再到抽象工廠,漸進明細的過程,逐步深刻的理解,比較優劣,擇優而爲咱們所用。spa

試想咱們遇到如下情景,咱們該怎麼處理設計

在工做中,咱們須要處理不一樣類型的文件,有音頻的,視頻的,圖片的,文本的。經過程序的處理,咱們能夠分別提取到不一樣的信息。code

這種狀況你準備怎麼處理視頻

工做經驗少的同窗默默的心理噗嗤一聲,看我5分鐘搞定對象

 class Program
    {
        static void Main()
        {
            var fileType = "Video";
            switch (fileType)
            {
                case "Video":
                    HandleVideoFile(fileType);
                    break;
                case "Audio":
                    HandleAudioFile(fileType);
                    break;
                case "Image":
                    HandleImageFile(fileType);
                    break;
                case "Text":
                    HandleTextFile(fileType);
                    break;
            }
            Console.ReadKey();
        }

        public static void HandleTextFile(string fileType)
        {
            Console.WriteLine("我開始處理文本文件了");
        }

        public static void HandleImageFile(string fileType)
        {
            Console.WriteLine("我開始處理圖片文件了");
        }

        public static void HandleAudioFile(string fileType)
        {
            Console.WriteLine("我開始處理音頻文件了");
        }

        public static void HandleVideoFile(string fileType)
        {
            Console.WriteLine("我開始處理視頻文件了");
        }
    }
View Code

各個方法封裝,獨立,可隨處調用,面向對象三大特性,簡簡單單隨隨便便給你展示一臉blog

後來,系統變強壯了,業務增長了,要求同時也能處理郵件Email

是否是你這個時候開始修改代碼,增長一個方法,添加一個case,break;

若是後續陸陸續續好幾十種繼續增長,怎麼辦。程序的可維護性,可擴展性在哪裏?

開放-封閉原則在哪裏?

開放-封閉原則是隻軟件實體(類,模塊,函數等等),應該能夠擴展,可是不可修改

拋開全部原則,再增長5個,你這個類的代碼得有1000行了吧,那麼多case,break, 那天稍微不當心的改錯一個,是否是會引發巨震。

因此,咱們開始進行修改,也就是咱們接下來進入正題的 簡單工廠模式。

所謂的簡單工廠模式,是將一個具體類的實例化交給一個工廠方法來執行

1個點,敲黑板,重點來了

工廠方法來執行。首先須要一個工廠,還須要一個方法。一個方法來幹嗎?來實例化具體的類,具體的什麼類?具體的算法類!

咱們首先來定義一個抽象類

    public abstract class Handle
    {
        public abstract void HandleFile();
    }
View Code

這個類告訴全世界,要實現我,就得實現個人方法,咱們是強關係,咱們是合成關係,咱們是擁有關係,咱們是鳥兒與翅膀的關係!

並且不許實現我,要實現,先繼承,要繼承,就得override個人全部方法

因而,不得已,要處理的類紛紛開始實現

文件處理類

    /// <summary>
    /// 文本處理類
    /// </summary>
    public class TextHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理文本文件了");
        }
    }
View Code

圖片處理類

   /// <summary>
    /// 圖片處理類
   /// </summary>
    public class ImageHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理圖片文件了");
        }
    }
View Code

視頻處理類

    /// <summary>
    /// 視頻處理類
    /// </summary>
    public class VideoHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理視頻文件了");
        }
    }
View Code

音頻處理類

    /// <summary>
    /// 音頻處理類
    /// </summary>
    public class AudioHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理音頻文件了");
        }
    }
View Code

全部的處理類咱們定義好了,若是後續,業務變動,需求增長,再添加什麼郵件啊,電話啊,其餘什麼的,咱們只須要繼續添加咱們的類,而不是經過去添加方法,這樣每一個類的單一職責原則是否是體現的很淋漓盡致了,若是單一職責以爲太書面,咱們換個稱呼,單一功能原則!無法再簡單了

全部的處理類已經Ready了,咱們的重點工廠能夠開始修建了

    public class HandleFactory
    {
        public Handle CreateHandle(string fileType)
        {
            Handle handle = null;
            switch (fileType)
            {
                case "Video":
                    handle = new VideoHandle();
                    break;
                case "Audio":
                    handle = new AudioHandle();
                    break;
                case "Image":
                    handle = new ImageHandle();
                    break;
                case "Text":
                    handle = new TextHandle();
                    break;
            }
            return handle;
        }
    }
View Code

不要指指點點,不要指指點點,不要指指點點

咱們就像項目過程同樣,漸進明細

此次介紹的是簡單工廠模式,簡單工廠重點是 簡單,工廠

後續增長業務的時候,咱們只須要再加case,和對應的Handle類就行了

如何調用呢

 class Program
    {
        static void Main()
        {
            var handleFactory = new HandleFactory();
            var fileType = "Text";
            var handle = handleFactory.CreateHandle(fileType);
            handle.HandleFile();
        }

    }
View Code

是否是一下簡單明瞭,你要是Web程序,能夠,要是CS程序,能夠,要是WebAPI,也能夠

易擴展,可維護

 

總結下

優勢

一、擴展性高,若是想增長一個處理方式,只要擴展一個處理類就能夠。

二、屏蔽實現,只關心處理的結果

三、帶你走進工廠模式

缺點

一、每次增長一個處理對象的時候,都須要增長一個處理類,還要同時告訴工廠,增長處理類型

二、增長了系統具體類的依賴

 

以上就是關於簡單工廠模式的分享

一路前行,風雨無阻,不定時更新

相關文章
相關標籤/搜索