1. 程式人生 > >大話設計模式-第08章 雷鋒依然在人間--工廠方法模式

大話設計模式-第08章 雷鋒依然在人間--工廠方法模式

08章雷鋒依然在人間--工廠方法模式

8.2 簡單工廠模式實現

8.2 簡單工廠模式實現.tiff

class OperationFactory

{

    public static Operation createOperate(string operate)

    {

        Operation Oper = null;

        switch (operate)

        {

            case “+”:

                oper = new OperationAdd();

                break;

            case “-“:

                oper = new OperationSub();

                break;

            case “*”:

                oper = new OperationMul();

                break;

            case “/“

                oper = new OperationDiv();

                break;

        }

        return oper;

    }

}

客戶端的應用

Operation oper;

oper = OperationFactory.createOperate(“+”);

oper.NumberA = 1;

oper.NumberB = 2;

double result = oper.GetResult();

8.3 工廠方法模式實現

8.3 工廠方法模式實現.tiff

先構建一個工廠介面:

interface IFactory

{

    Operation CreateOperation();

}

然後加減乘除各建一個具體工廠去實現這個介面。

class AddFactory : IFactory

{

    public Operation CreateOperation()

    {

        return new OperationAdd();

    }

}

class SubFactory : IFactory

{

    public Operation CreateOperation()

    {

        return new OperationSub();

    }

}

class MulFactory : IFactory

{

    public Operation CreateOperation()

    {

        return new OperationMul();

    }

}

class DivFactory : IFactory

{

    public Operation CreateOperation()

    {

        return new OperationDiv();

    }

}

客戶端的實現是這樣的:

IFactory operFactory new AddFactory();

Operation oper = operFactory.CreateOperation();

oper.NumberA = 1;

oper.NumberB = 2;

double result = oper.GetResult();

8.4 簡單工廠VS工廠方法

    簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。但簡單工廠不但對擴充套件開放,也對修改開放,這違背了開放封閉原則

簡單工廠VS工廠方法.tiff

    我們講過,既然這個工廠類與分支耦合,那麼我們就對他下手,根據依賴倒轉原則,我們把工廠類抽象出一個介面,這個介面只有一個方法,就是建立抽象產品的工廠方法。然後,所有的要生產具體類的工廠,就去實現這個介面,這樣,一個簡單工廠模式的工廠類,就變成了一個工廠抽象介面和多個具體生成物件的工廠,當我們需要增加新的功能時,就不需要更改原有的工廠類了,只需要增加此功能的運算類和相應的工廠類就可以了。

簡單工廠VS工廠方法 結構圖.tiff

    這樣整個工廠和產品體系其實都沒有修改的變化,而只是擴充套件的變化,這就完全符合了開放-封閉原則的精神。

    工廠方法模式實現時,客戶端需要決定例項化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移動到了客戶端程式碼來執行。你想要加功能,本來是該工廠類的,而現在是修改客戶端。

8.5 雷鋒工廠

//雷鋒

class LeiFeng

{

    public void Sweep()

    {

        Console.WriteLine(“掃地”);

    }

    public void Wash()

    {

        Console.WriteLine(“洗衣”);

    }

    public void BuyRice()

    {

        Console.WriteLine(“買米”);

    }

}

//學雷鋒的大學生

class Undergraduate : LeiFeng

{ }

//客戶端實現

Leiteng xueleifeng = new Undergraduate();

xueleifeng.BuyRice();

xueleifeng.Sweep();

xueleifeng.Wash();

//如果是有三個人學雷鋒

Leiteng xueleifeng1 = new Undergraduate();

xueleifeng1.BuyRice();

Leiteng xueleifeng2 = new Undergraduate();

xueleifeng2.Sweep();

Leiteng xueleifeng3 = new Undergraduate();

xueleifeng3.Wash();

//社群志願者

class Volunteer : LeiFeng

{ }

//簡單雷鋒工廠

class SimpleFactory

{

    public static LeiFeng CreateLeiFeng(string type)

    {

        LeiFeng result = null;

        switch (type)

        {

            case “學雷鋒的大學生”:

                result = new Undergraduate();

                break;

            case “社群志願者”:

                result = new Volunteer();

                break;

        }

        return result;

    }

}

//簡單工廠模式

LeiFeng studentA = SimpleFactory.CreateLeiFeng(“學雷鋒的大學生”);

studentA.BuyRice();

LeiFeng studentB = SimpleFactory.CreateLeiFeng(“學雷鋒的大學生”);

studentB.Sweep();

LeiFeng studentC = SimpleFactory.CreateLeiFeng(“學雷鋒的大學生”);

studentC.Wash();

此時你就發現,你需要在任何例項化的時候寫出這個工廠的程式碼。這裡有重複,也就有了壞味道。再用工廠方法模式寫一遍:

//雷鋒工廠

interface IFactory

{

    LeiFeng CreateLeiFeng();

}

//學雷鋒的大學生工廠

class UndergraduateFactory : IFactory

{

    public LeiFeng CreateLeiFeng()

    {

        return new Undergraduate;

    }

}

//社群自願者工廠

class VolunteerFactory : IFactory

{

    public LeiFeng CreateLeiFeng()

    {

        return new Volunteer();

    }

}

客戶端呼叫的時候只需要這樣就可以一了。

//工廠方法模式

IFactory factory = new UndergraduateFactory();

LeiFeng student = factory.CreateLeiFeng();

student.BuyRice();

student.Sweep();

student.Wash();

現在如果需要修改的話只需要修改一處就可以了。利用反射技術可以做到更好。

相關推薦

大話設計模式08 雷鋒依然人間工廠方法模式

第08章雷鋒依然在人間--工廠方法模式 8.2 簡單工廠模式實現 class OperationFactory {     public static Operation createOperate(string operate)     {      

大話設計模式(C++)-裝飾模式

  二、概念 裝飾模式:動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模式是為已有功能動態地新增更多功能的一種方式。 三、說明 角色: (1)Component是定義一個物件,可以給這些物件動態地新增職責。 (2)C

大話設計模式(C++)-代理模式

概念 代理模式:為其他物件提供一種代理以控制對這個物件的訪問。 應用場景 (1)遠端代理,也就是為一個物件在不同的地址空間提供區域性代表。這樣可以隱藏一個物件存在於不同地址空間的事實。 (2)虛擬代理,是根據需要建立開銷很大的物件。通過他來存放例項化需要很

大話設計模式》——讀後感 (5)雷鋒依然人間?——工廠方法模式

pri sys rod 加法 完全 .cn 依賴關系 style 優點 什麽是工廠方法模式: 工廠方法UML結構圖: 從圖中我獲取以下信息: 1、 Product是個接口,而Creator是個抽象類(我還是試試接口) 2、ConcreateProduct和Concret

《.NET 設計規範》 9 :常用的設計模式

負責 工廠 tag var process api 實例 sco 允許 第 9 章:常用的設計模式 9.1 聚合組件   考慮為常用的特性域提供聚合組件。   要用聚合組件來對高層的概念(物理對象)進行建模,而不是對系統級的任務進行建模。   要讓聚合組件的名字與眾

js設計模式 工廠方法模式 讀書筆記

對於建立多類物件,簡單工廠就不太實用了。  通過工廠方法模式可以輕鬆的建立多個類的例項物件,而且建立物件的方式避免了使用者與物件類之間的耦合,使用者不必關心建立該物件的具體類,只需呼叫工廠方法即可。 安全的工廠方法模式 var Factory=function(type,con

java設計模式精講 Debug 方式+記憶體分析 5 工廠方法模式

工廠方法模式 5-1 工廠方法講解 5-2 工廠方法coding 5-3 工廠方法原始碼解析(jdk+logback) 5-1 工廠方法講解 5-2 工廠方法coding 業務場景和之前的簡

圖解java多執行緒設計模式學習Producer-Consumer模式

生產者消費者模式,生產者安全地將資料交給消費者。雖然僅是這樣看似簡單的操作,但當生產者和消費者以不同的執行緒執行時,兩者之間的處理速度差異便會引起問題。例如,消費者想要獲取資料,可資料還沒有生成,或者生產者想要交付資料,而消費者的狀態還無法接收資料等。一般來說,在該模式中,生

圖解java多執行緒設計模式學習Read-Write Lock模式

學生們正在一起看老師在黑板上寫的板書。這時,老師想插掉板書,再寫新的內容。而學生們說道:“”老師,我們還沒看完了,請先不要摖掉“”。於是,老師會等待大家都看完。當執行緒“”讀取“”例項的狀態時,例項的狀態不會發生變化。例項的狀態僅線上程執行“”寫入“”操作時才會發生變化。從例

《.NET 設計規範》 4 :類型設計規範

這樣的 方法 開放 flags 包含 困難 自由 權限 center 第 4 章:類型設計規範 4.1 類型和命名空間   要用命名空間把類型組織成一個由相關的功能區所構成的層次結構中。   避免非常深的命名空間層次。因為用戶需要經常回找,所以這樣的層次瀏覽起來很困難

《.NET 設計規範》 5 :成員設計

支持 派生 精度 tex 邏輯 最好 功能 一個 覆蓋 《.NET 設計規範》第 5 章:成員設計 5.1 成員設計的通用規範   要盡量用描述性的參數名來說明在較短的重載中使用的默認值。   避免在重載中隨意地改變參數的名字。如果兩個重載中的某個參數表示相同的輸入,

《.NET 設計規範》 7 :異常

運行 finall 輸出參數 特定 所有 具體類 撰寫文檔 撰寫 gin 第 7 章:異常   異常與各種面向對象語言集成得非常好。   異常增強了 API 的一致性。   在用返回值來報告錯誤時,錯誤處理的代碼與可能會發生錯誤的代碼距離總是很近。   更容易使錯誤

《.NET 設計規範》 8 :使用規範

lin add 技術 具體類 行數據 數據 align 復制 程序 第 8 章:使用規範 8.1 數組   要在公共 API 中優先使用集合,避免使用數組。   不要使用只讀的數組字段。雖然字段本身是只讀的,用戶不能修改它們,但用戶可以修改數組中的元素。   考慮使

大話設計模式讀書筆記——工廠方法模式

down 除了 wikipedia override 客戶 class a over dfa mar 工廠方法模式 工廠方法模式的實質是“定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。工廠方法讓類的實例化推遲到子類中進行。 工廠方法模式 VS 簡單工廠

大話設計模式工廠方法模式讀後感

ima opera 子類 行為 AR uml圖 mage public err 引言:讓我們重溫經典,致敬經典 工廠方法模式:定義一個用於創建對象的接口,讓子類來決定實例化哪一個類,工廠方法使一個類的實例化延遲到了子類。 UML圖: 1 package com.dzf

08上 makefile

c++ code 命名 test 不改變 ble tex RF 註釋 通常一個大型程序有多個程序模塊文件構成,按照功能劃分,模塊文件分布在不同的目錄中,模塊文件之間需要包含頭文件,函數調用的情況,它們之間存在依賴關系。通常情況下,我麽你編寫程序只是修改了某些文件,並不是更新

08中 斷言和位圖

內存池 null 多少 下標 復雜 取模 每一個 復制 個數 目錄結構: └── bochs ├── 02.tar.gz ├── 03.tar.gz ├── 04.tar.gz ├── 05a.tar.gz ├── 05b.tar.gz ├── 06a.tar.gz ├──

4 建立型模式工廠方法模式(1)

1. 簡單工廠 1.1 簡單工廠的定義 (1)提供一個建立物件例項的功能,而無須關心其具體實現。   ①Api介面:定義客戶所需要的功能介面   ②Impl:具體實現Api的實現類,可能會有多個   ③SimpleFatory類:工廠,選擇合適的實現類來建立Api介面物件

大話設計模式學習筆記-工廠方法模式

ole stat 決定 vol 設計 乘除 under 結果 缺點 工廠方法模式 工廠方法模式定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。 簡單工廠模式的優缺點 簡單工廠模式最大的優點在於工廠類中包含了必要的邏輯判斷,根據客

《Java多執行緒程式設計實戰》—— 9 Thread Pool(執行緒池)模式

一個系統中的執行緒相對於其所要處理的任務而言,是一種非常有限的資源。執行緒不僅在執行任務時需要消耗CPU時間和記憶體等資源,執行緒物件(Thread例項)本身以及執行緒所需的呼叫棧(Call Stack)也佔用記憶體,並且Java中建立一個執行緒往往意味著JVM會建立相應的依賴於宿主機作業系