1. 程式人生 > >C#設計模式(4)-Simple Factory Pattern

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(
"Tube Light is Turned on");
   }


   
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#設計模式4Simple 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)模式構建器逐步構建最終物件,此構建器獨立於其他物件。 實用例項 我們考慮了一家快餐店的商業案例,其中典型的餐點可能是漢堡和冷飲

設計模式15Facade Pattern

一、 門面(Facade)模式 外部與一個子系統的通訊必須通過一個統一的門面(Facade)物件進行,這就是門面模式。 醫院的例子 用一個例子進行說明,如果把醫院作為一個子系統,按照部門職能,這個系統可以劃分為掛號、門診、劃價、化驗、收費、取藥等。看病的病人要與這些部門打交道,就如同一個子系統的客戶端與