設計模式你怎么看?--簡單工廠模式


一 前言

  設計模式你怎么看? 我會寫一個系列,因為自己最近才開始了解設計模式,說來慚愧畢業快兩年了才開始學習,之所以迫切的覺得自己需要學習設計模式,是因為在工作中發現總感覺自己的代碼不完美,但又想不出什么辦法去改善,又感覺代碼基本上都是面向過程的,而非面向對象。對於面向對象的概念也只是空喊概念 "繼承,多態,封裝" 而並沒有真正融入到代碼中去。

  在沒想學設計模式前,我總以為既然和設計有關那一定要有非富的編碼經驗和設計能力,才能理解和利用設計模式。       但!當我開始了了解設計模式時,我是萬分后悔,自己的想法太天真了,自己還是 Too young Too simple,其實設計模式就應該在對於編程語言的語法熟悉 經歷了一段時間的編程后 就應該開始了解,在此我真心的建議園子里還沒有接觸 設計模式的 朋友,不要再猶豫了立馬行動起來,我可以肯定的說 了解設計模式后 對於 自己的思想高度會有一個質的提升。

      以上是自己對於設計模式的一點感悟,可能很片面但只是我自己的一點想法。下面開始敲開設計模式的大門吧,這里面的東西,也許你看不明白,但是不要緊,隨着時間的推移,總有一天你會恍然大悟的!!

 

二 介紹 設計模式

     2.1  什么是設計模式 :設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構一樣(摘自百度百科)

    2.2 設計模式分類: 設計模式 分為原則與模式原則有如下幾種 單一職責,開放-封閉原則,依賴倒轉原則,迪米特法則,接口隔離原則,Liskov替換原則

  而模式則有20多種 這里就不列舉了,我會在后面的文章中逐一寫出的。

三 第一個模式 簡單工廠模式 

 

  3.1 什么是工廠模式

   首先從文字上理解 工廠通常都是用於生產產品的,而對於產品的用戶是不關心生產流程的,只關心最后生產出來的結果,而在代碼中工廠類通常用於實例化具體的類並返回類的實例給調用者,使得調用者不用關心這個實例化的過程是怎樣的,得到實例后只管用就好。

      3.2 為什么要用工廠模式 

    設計模式最終的目的就是想 通過封裝 繼承 多態 把程序的耦合降低,增加程序的復用性,可維護性,減少重復代碼等等,把面向過程的開發方式轉為面向對象。

      3.3 工廠模式UML類圖

   

      

        通過上面的UML圖 大至可以了解工廠模式的結構,我們以鳥這一生物種類來舉例,先定義了Bird基類 所有的鳥肯定都是有羽毛與翅膀的,

     所以我們定義這兩個方法Feather(羽毛) 與Wing(翅膀),然后讓各種具體的鳥(Ostrich,Sparrow,Eagle)去繼承Bird基類並選擇性的重寫基類方法,

    因為並不是所有鳥類羽毛翅膀都是一至的。

   然后通過Factory(工廠類)來創建客戶端所需要的具體實例,下面來看代碼是如何體現這一關系的

 

  3.4  工廠模式代碼 

     Bird 類 定義所有鳥類所共有的特性

    /// <summary>
    /// 所有鳥類的抽象基類
    /// </summary>
    public abstract class Bird
    {
        public virtual void Feather()
        {
            Console.Write("我有羽毛了\r\n");
        }

        public virtual void Wing()
        {
            Console.Write("我有翅膀了\r\n");
        }
    }

 

老鷹屬性鳥類 具有鳥類特有屬性 翅膀與羽毛,但是老鷹的翅膀比一般的鳥在寬闊所以可以重寫Bird基類中的Wing方法體現自己的特性

    class Eagle:Bird
    {
        public override void Feather()
        {
            base.Feather();
        }

        public override void Wing()
        {
            Console.Write("我是老鷹我的翅膀很寬闊!\r\n");
        }

    }

 

駝鳥 (Ostrich )與鷹(Eagle)一樣屬於鳥類,但駝鳥卻不會飛所以也重寫了Wing方法

    public class Ostrich : Bird
    {
       public override void Feather()
       {
           base.Feather();
       }
       public override void Wing()
       {
           Console.Write("我是駝鳥有翅膀也不能飛!\r\n");
       }

    }

 Sparrow同上

    class Sparrow:Bird
    {
        public override void Feather()
        {
            Console.Write("我是麻雀我的羽毛是麻色的!\r\n");
        }
        public override void Wing()
        {
            base.Wing();
        }

    }

 

 工廠類

結合我們的實際生活,工廠是用於生產 產品的,整個生產過程對於工廠內部是可見的,所以可以從代碼中看到具體的實例化過程

   public  class Factory
    {
       public static Bird CreateInstance(string birdType)
        {
            Bird instance = null;
            switch (birdType)
            {
                case "Ostrich":
                    instance  =new Ostrich();
                    break;
                case "Eagle":
                    instance = new Eagle();
                    break;
                case "Sparrow":
                    instance = new Sparrow();
                    break;
                
            }
            return instance;
        }
    }

 

 

客戶端調用類

客戶端就好比是用戶,當用戶需要某一產品時,是不需要知道這個產品是如何生產出來的,只要得到我想要的產品就行。而生產的過程已被封裝到工廠類(Factory)中

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("輸入要生成鳥~~ Eagle Ostrich  Sparrow");
            string item = Console.ReadLine().Trim();
            Bird instance =  Factory.CreateInstance(item);
            instance.Feather();
            instance.Wing();
            Console.ReadLine();
        }
    }

 

運行結果如下

 

 

一個簡單的工廠模式的代碼就寫完了,但是以上代碼還是有問題它違背了開放封閉原則(對新增是開的對修改是封閉的)什么意思呢?

如果某天需求變更,突然要加一種新的鳥比如"企鵝"  那我們的做法是 1 ,新增"企鵝類"並繼承Bird類 2,在工廠類與客戶端類中都加一條分支語句

來判斷是否實例化該類,而這一操作就違背了開放封閉原則,至於如何解決這一問題,在后續的文章中會陸續回答。

 

四 總結

   有幾個月沒寫文章了,感覺還是沒有徹底把自己把所想的表達出來,設計模式我也是最近才開始研究,對於它的理解肯定也是很淺顯的,若要把設計模式靈活的應用到項目中去,必然是要經過大量的編程實踐才能明白它的精髓,每一位大牛的成長,必然是有菜鳥這個階段的,只要肯堅持努力,菜鳥逆襲也只是時間問題!

 

  本人技術與文字水平實在有限,如有理解不對之處還望指出!

     

如果您覺得本文有給您帶來一點收獲,不妨點個推薦,為我的付出支持一下,謝謝~

如果希望在技術的道路上能有更多的朋友,那就關注下我吧,讓我們一起在技術的路上奔跑

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com