【大話設計模式】—— 工廠方法模式

ZeroWM發表於2014-06-08

一、概念

  想象一下我們的平常見到的工廠,下一個訂單,付了訂金,一段時間後就可以提貨。我們不需要知道工廠是用的什麼機器,怎麼安排工人的,從哪來的材料,僅僅需要一個訂單就好,工廠就可以按照其固定流水線做出我們所需要的產品。設計模式中也有類似的一個大神:工廠方法模式。

  下面讓我們來認識一下:

  工廠方法模式(Factory Method):定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。

  

二、UML圖

Product(抽象產品)

ConcreteProduct(具體產品)

Creator(抽象工廠)

ConcreteCreator(具體工廠)



三、例項解析

  首先有一個大學生,以學雷鋒的名義去幫助老人做事。

  雷鋒類,擁有掃地、洗衣、買米等方法,大學生和志願者繼承雷鋒的光榮傳統,擁有父類雷鋒類的 掃地、洗衣、買米等方法。建立一個總的雷鋒工廠介面用於建立物件,讓子類學雷鋒的大學生工廠 和社群志願者工廠決定例項化哪個類。


程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)

        {
            IFactory factory = new UndergraduateFactory();
            LeiFeng student = factory.CreateLeiFeng();

            student.BuyRice();
            student.Sweep();
            student.Wash();
        }
    }

    //雷鋒
    class LeiFeng
    {
        public void Sweep()
        {
            Console.WriteLine("掃地");
        }
        public void Wash()
        {
            Console.WriteLine("洗衣");
        }
        public void BuyRice()
        {
            Console.WriteLine("買米");
        }
    }
    //學雷鋒的大學生
    class Undergraduate : LeiFeng
    { }

    //學雷鋒的志願者
    class Volunteer : LeiFeng
    { }

    
    //雷鋒工廠
    interface IFactory
    {
        LeiFeng CreateLeiFeng();
    }

    //學雷鋒的大學生工廠
    class UndergraduateFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Undergraduate();
        }
    }

    //學雷鋒的社群志願者工廠
    class VolunteerFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Volunteer();
        }
    }
 
}

結果:


四、總結

  簡單工廠模式解決了物件的建立問題,它把所有的細節判斷都一股腦的扔給了工廠。工廠包含了必要的邏輯判斷,能夠根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。凡事都有相對性,有利有弊。新增是方便了,但是後期維護和擴充套件都需要修改工廠,違背了開閉原則。

  策略模式,封裝了演算法,減少了各種演算法類與使用演算法類之間的耦合,但是將判斷放入了客戶端,無形之間給客戶端增加了壓力。簡單工廠和策略兩者一結合,把判斷隔離出來,單放一個類,就挺好的了。

  工廠方法模式是簡單工廠模式的進一步抽象和推廣。它是針對修改工廠這一弊端而誕生出來的。當我們再新增一個演算法的時候,不需要修改原有工廠類,只需要新增此功能的運算類和相應的工廠類就可以了。克服了開閉原則,又保持了封裝物件建立過程的優點。凡事過猶不及,如果增加的產品多了,增加的產品工廠類就增多,額外開發量是很大的。

 

五、感受

  學設計模式,就好像一個公司:有一個大boss(客戶端),負責接收和處理系統事件。大boss安排幾個專業人士(類),能夠完成各自擅長領域的工作(高內聚),但是他們不僅僅要學會各司其職,也要學會合作(耦合)。為了避免這麼多人都一塊討論,效率低下,就出現了各個部門(多型,抽象類),降低了辦公室戀情的概率。。。(低耦合),提高了辦事效率。

  每個設計模式跟人一樣都不是十全十美的,只有大家分工合作,才能做到手中無劍,心中無劍的境界。


Ps:期待大家指點O(∩_∩)O~




相關文章