C#設計模式(4)-Simple Factory Pattern
工廠模式專門負責將大量有共同介面的類例項化。工廠模式可以動態決定將哪一個類例項化,不必事先知道每次要例項化哪一個類。工廠模式有以下幾種形態:
- 簡單工廠(Simple Factory)模式
- 工廠方法(Factory Method)模式
- 抽象工廠(Abstract Factory)模式
一、 簡單工廠(Simple Factory)模式
Simple Factory模式根據提供給它的資料,返回幾個可能類中的一個類的例項。通常它返回的類都有一個公共的父類和公共的方法。
Simple Factory模式實際上不是GoF 23個設計模式中的一員。
二、 Simple Factory模式角色與結構:
工廠類角色Creator (LightSimpleFactory):工廠類在客戶端的直接控制下(Create方法)建立產品物件。
抽象產品角色Product (Light):定義簡單工廠建立的物件的父類或它們共同擁有的介面。可以是一個類、抽象類或介面。
具體產品角色ConcreteProduct (BulbLight, TubeLight):定義工廠具體加工出的物件。
三、 程式舉例:
using System;
publicabstractclass Light
{
publicabstractvoid TurnOn();
publicabstractvoid TurnOff();
publicclass BulbLight : Light
{
publicoverridevoid TurnOn()
{
Console.WriteLine("Bulb Light is Turned on");
}
publicoverridevoid TurnOff()
{
Console.WriteLine("Bulb Light is Turned off");
}
}
publicclass TubeLight : Light
{
publicoverridevoid TurnOn()
{
Console.WriteLine(
}
publicoverridevoid TurnOff()
{
Console.WriteLine("Tube Light is Turned off");
}
}
publicclass LightSimpleFactory
{
public Light Create(string LightType)
{
if(LightType =="Bulb")
returnnew BulbLight();
elseif(LightType =="Tube")
returnnew TubeLight();
else
returnnull;
}
}
publicclass Client
{
publicstaticvoid Main()
{
LightSimpleFactory lsf =new LightSimpleFactory();
Light l = lsf.Create("Bulb");
l.TurnOn();
l.TurnOff();
Console.WriteLine("-----------------");
l = lsf.Create("Tube");
l.TurnOn();
l.TurnOff();
}
}
四、 Simple Factory模式演化
Simple Factory模式演化(一)
除了上面的用法外,在有些情況下Simple Factory可以由抽象產品角色扮演,一個抽象產品類同時是子類的工廠。
程式舉例:
using System;publicclass Light
{
publicvirtualvoid TurnOn()
{
}
publicvirtualvoid TurnOff()
{
}
publicstatic Light Create(string LightType)
{
if(LightType =="Bulb")
returnnew BulbLight();
elseif(LightType =="Tube")
returnnew TubeLight();
else
returnnull;
}
}
publicclass BulbLight : Light
{
publicoverridevoid TurnOn()
{
Console.WriteLine("Bulb Light is Turned on");
}
publicoverridevoid TurnOff()
{
Console.WriteLine("Bulb Light is Turned off");
}
}
publicclass TubeLight : Light
{
publicoverridevoid TurnOn()
{
Console.WriteLine("Tube Light is Turned on");
}
publicoverridevoid TurnOff()
{
Console.WriteLine("Tube Light is Turned off");
}
}
publicclass Client
{
publicstaticvoid Main()
{
Light l = Light.Create("Bulb");
l.TurnOn();
l.TurnOff();
Console.WriteLine("-----------------");
l = Light.Create("Tube");
l.TurnOn();
l.TurnOff();
}
}
Simple Factory模式演化(二)
三個角色全部合併:
與單件模式(Singleton)相近,但是有區別。
五、 優點與缺點:
優點:
工廠類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的例項,客戶端可以免除直接建立產品物件的責任,而僅僅"消費"產品。簡單工廠模式通過這種做法實現了對責任的分割。
缺點:
當產品有複雜的多層等級結構時,工廠類只有自己,以不變應萬變,就是模式的缺點。因為工廠類集中了所有產品建立邏輯,一旦不能正常工作,整個系統都要受到影響。
同時,系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,有可能造成工廠邏輯過於複雜。
另外,簡單工廠模式通常使用靜態工廠方法,這使得無法由子類繼承,造成工廠角色無法形成基於繼承的等級結構。
參考文獻:
閻巨集,《Java與模式》,電子工業出版社
[美]James W. Cooper,《C#設計模式》,電子工業出版社
[美]Alan Shalloway James R. Trott,《Design Patterns Explained》,中國電力出版社
[美]Robert C. Martin,《敏捷軟體開發-原則、模式與實踐》,清華大學出版社
[美]Don Box, Chris Sells,《.NET本質論 第1卷:公共語言執行庫》,中國電力出版社
相關推薦
C#設計模式(4)-Simple Factory Pattern
工廠模式專門負責將大量有共同介面的類例項化。工廠模式可以動態決定將哪一個類例項化,不必事先知道每次要例項化哪一個類。工廠模式有以下幾種形態: 簡單工廠(Simple Factory)模式 工廠方法(Factory Method)模式 抽象工廠(Abstract Factory)模式 一、
23種設計模式(4):建造者模式
out 比較 組件 rec this 建造者 交互 變化 整體 定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 類型:創建類模式。 類圖: 四個要素: 1,產品類:一般是一個較為復雜的對象,也就是說創建對象的過程比較復雜,一般會有比
C#設計模式(1)——設計原則
設計原則 使用設計模式的根本原因是適應變化,提高程式碼複用率,使軟體更具有可維護性和可擴充套件性。在進行設計的時候,我們需要遵循以下幾個原則:單一職責原則、開閉原則、里氏替代原則、依賴倒置原則、介面隔離原則、合成複用原則和迪米特法則。 1.單一職責原則 專業的人做專業的事,面向物件程式設計中類也是一
C#設計模式(1)——簡單工廠模式
void 例子 代碼復用 操作 inf 這樣的 man ger troy 1.什麽是簡單工廠 現實中的工廠負責生產產品,編程中的簡單工廠顧名思義就是一個生產對象的類,它的主要作用是封裝改變。我們在平時的工作必不可免的和各種數據庫打交道,我們就以一個數據庫服務類為例來分
設計模式(4)—— 建立型 ——單例(Singleton)
導航 首先通過懶漢式的單例模式簡單程式碼實現作為開頭,發現有執行緒安全問題,並且在此懶漢模式程式碼上進行改進,衍生出同步懶漢設計模式,雙重檢查懶漢設計模式。另外還有靜態內部類方式實現單例,它是一種基於類初始化的延遲載入解決方案。 與懶漢式相對應的是餓漢式單例模式,其在類載入時就進
C#設計模式(3)——抽象工廠模式
1.抽象工廠模式介紹 上一篇我們瞭解了工廠模式,知道工廠模式可以解決簡單工廠的缺陷(簡單工廠新增新產品時要修改工廠類,不符合開閉原則),但是簡單工廠和工廠模式都是隻生產一種產品(前邊的簡單工廠和工廠都只生產滑鼠),實際上戴爾和惠普公司不僅生產滑鼠還生產鍵盤,為了解決系列產品的問題,就有了抽象工廠模式。我
C#設計模式(6)——原型模式
1.原型模式介紹 在軟體系統開發中,有時候會遇到這樣的情況:我們需要用到多個相同例項,最簡單直接的方法是通過多次呼叫new方法來建立相同的例項。如下: Person person=new Person(){Name="jack",Age=20}; Person person2=new Pers
C#設計模式(5)——建造者模式
1.建造者模式介紹 在軟體開發中,有時我們要建立一個複雜的物件,這個物件由幾個子部件按一定的步驟組合而成,這時候我們就可以使用建造者模式了。說到建造者我們首先想到的是蓋房子,蓋房子簡單的說有三個步驟:打地基,砌磚,粉刷。我們就以蓋房子為例解釋建造者模式的用法。 建造者模式有三個角色:建造者,具體的
C#設計模式(8)——外觀模式 java設計模式之外觀模式(門面模式)
1.外觀模式介紹 外觀模式也被叫做門面模式,這種模式的作用是:隱藏系統的複雜性,並向客戶端提供了一個可以訪問系統的統一介面,這個統一的介面組合了子系統的多個介面。使用統一的介面使得子系統更容易被訪問或者使用。 以去醫院看病為例,去醫院看病時可能要去掛號、門診、劃價、取藥等,讓患者或患者家屬覺得很複雜,如
C#設計模式(9)——代理模式
1.代理模式介紹 在軟體開發中有時會遇到不能直接使用物件的問題,如我們要使用的物件在程序外,甚至在遠端的機器上,但是我們要使用這個物件的功能怎麼辦呢?代理模式就可以用來解決這個問題。舉一個生活中的例子:一個害羞男孩追求一個叫如花的女孩,但是自己不敢送禮物,就找了一個朋友代理他給如花送禮物。就以這個例子介
C#設計模式(13)——享元模式
1.享元模式介紹 在軟體開發中我們經常遇到多次使用相似或者相同物件的情況,如果每次使用這個物件都去new一個新的例項會很浪費資源。這時候很多人會想到前邊介紹過的一個設計模式:原型模式,原型模式通過拷貝現有物件來生成一個新的例項,使用拷貝來替代new。原型模式可以很好的解決建立多個相同/相似例項的問題,為
PHP設計模式(4)—— 資料物件對映模式
基本概念 資料物件對映模式,是將物件和資料儲存對映起來,對一個物件操作會對映成對資料儲存的操作。 這個模式的應用例子就是現在流行的ORM。 簡單例子 User類 class User { // 屬性和資料庫表的欄位一一對應 public $id;
C++設計模式(一)——建立型模式
設計模式指導我們怎樣去建立、維護、分配面向物件系統中的實體類, 以獲得高內聚、低耦合的面向物件系統,從而提高系統的可維護性和可複用性。設計模式是OO的一些設計思想的一個總結(但不是全部),因此設計模式和OO的設計原則經驗沒有矛盾,而是殊
設計模式(4)
介面卡模式:把一個類的介面變換成客戶端所期待的另一種介面(以兩孔、三孔插座為例) 類的介面卡模式: public interface IThreeHole { void Request(); } public abst
java設計模式---(4)原型模式
原型模式(Prototype Pattern)是用於建立重複的物件,同時又能保證效能。用原型例項來指定建立物件的種類,然後通過clone這個原型物件來建立新物件。 先定義一個學生類Student他實現Cloneable介面並重寫了clone()方法(clone()方法是Object類中定義的
設計模式(4)—— 單例(Singleton)
導航 首先通過懶漢式的單例模式簡單程式碼實現作為開頭,發現有執行緒安全問題,並且在此懶漢模式程式碼上進行改進,衍生出同步懶漢設計模式,雙重檢查懶漢設計模式。另外還有靜態內部類方式實現單例,它是一種基於類初始化的延遲載入解決方案。 與懶漢式相對應的是餓漢式單例模式
設計模式(4)代理模式
談及設計模式裡面的代理模式,不得不說,這個模式在網上有很多的應用場景。例如說,Spring裡面的代理機制,dubbo的動態代理模式生成proxy過程等等。 代理模式的概念: 代理模式是指使用代理物件來執行某一個物件所要執行的相應方法。 我們常說的代理模式主要劃分
Java設計模式(4)--觀察者模式
今天看了一下觀察者模式,總體來說不難,關鍵是要知道原理和這個模式的用法下面是我自己個人一些理解。 1、定義 觀察者模式,首先得有觀察者,一個或者多個觀察者,它們都依賴於另一個物件,也就是說,這些觀察者都觀察著一個被觀察者。那麼,當被觀察者狀態發生改變
JAVA設計模式(4):建造者模式
構建器(Builder)模式使用簡單物件並使用逐步方法構建複雜物件。 這種型別的設計模式屬於建立模式,因為此模式提供了建立物件的最佳方法之一。構建器(Builder)模式構建器逐步構建最終物件,此構建器獨立於其他物件。 實用例項 我們考慮了一家快餐店的商業案例,其中典型的餐點可能是漢堡和冷飲
設計模式(15)-Facade Pattern
一、 門面(Facade)模式 外部與一個子系統的通訊必須通過一個統一的門面(Facade)物件進行,這就是門面模式。 醫院的例子 用一個例子進行說明,如果把醫院作為一個子系統,按照部門職能,這個系統可以劃分為掛號、門診、劃價、化驗、收費、取藥等。看病的病人要與這些部門打交道,就如同一個子系統的客戶端與