c#原廠模式與抽象原廠模式 [轉載]

來源:互聯網
上載者:User

一、 Factory 方法(Factory Method)模式

Factory 方法(FactoryMethod)模式是類的建立模式,其用意是定義一個建立產品對象的工廠介面,將實際建立工作延遲到子類中。

Factory 方法模式是簡單原廠模式的進一步抽象和推廣。由於使用了多態性,Factory 方法模式保持了簡單原廠模式的優點,而且克服了它的缺點。

在Factory 方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不接觸哪一個產品類被執行個體化這種細節。這使得Factory 方法模式可以允許系統在不修改工廠角色的情況下引進新產品。

在Factory Method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。

二、 Factory Method模式角色與結構:

抽象工廠(Creator)角色:是Factory 方法模式的核心,與應用程式無關。任何在模式中建立的對象的工廠類必須實現這個介面。

具體工廠(Concrete Creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式調用以建立產品對象。

抽象產品(Product)角色:Factory 方法模式所建立的對象的超類型,也就是產品對象的共同父類或共同擁有的介面。

具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。

 

 原廠模式與抽象原廠模式是應用得比較多的構造型模式,先簡單的介紹一下這種構造模式的應用背景:        在開發一個類的過程中,我們一般都要為這個類開發相應的建構函式(不過大部分情況下,.NET開發環境會自動預設建立建構函式),這樣,使用這個類的客戶可以利用建構函式對這個類進行執行個體化.但是,有時候會出現這種情況:需要使用一個對象的客戶並不知道(或者不應該知道)應該對幾個類中的哪個類進行初始化.面對這個問題,我們可以利用原廠模式定義一個介面,客戶可以使用這個介面建立一個對象.同時我們還可以控制對哪個類進行執行個體化,執行個體化過程使用了一個方法,這個方法需要利用外部因素來確定對哪個類進行執行個體化.有時候,這些外部因素就是一個龐大的研究主題,並且往往會涉及到多個類.為此,抽象原廠模式就應用於這種場合,其目的是為了提供一個建立一系列相關或相互依賴對象的介面,而無需指定它們具體的類”,至少“無需指定它們具體的類”符合我們的要求。  下面就Gof's Design Pattern Framework2.0中的一個UML class diagram及一個通俗易懂的例子來說明一下:        這個圖比較形象直觀,能很清楚的看出抽象工廠與工廠以及客戶之間的關係.  下面就舉個例子來看看:         假如我的程式中有需要一系列的對象,比如bed,desk,chair…, 要想利用他們,我們就必須在程式中根據使用者要求,然後一個個調用 new 操作符來產生他們,這樣客戶程式就要知道相應的類的資訊,產生的程式碼顯然不夠靈活。再此它們顯然是一類的,都是furniture,既然如此,我們只要一個生產傢具的工廠就可以.我們可以在代碼中不利用具體的類,而只是說明我們需要什麼,然後就能夠得到我們想要的對象.先定義一個類,主要聲明一個傢具介面,床和椅子的類:Public interface IFurniture
{
}
public class Bed:IFurniture
{
 public Bed()
 {
  Console.WriteLine("I need a bed!");
 }
}
public class Desk:IFurniture
{
 public Desk()
 {
  Console.WriteLine("I need a desk!");
 }
}public class Chair:IFurniture
{
 public Chair()
 {
  Console.WriteLine("I need a chair!");
 }
}再定義一個傢具工廠的類(可以利用反射機制中Type類擷取Name指定的類名的類的Type資訊,然後可以根據這個資訊利用System.Activator建立對象):public class FurnitureFactory
{
 public IFurniture MakeFurniture(string Name)
 {
  IFurniture MyFurniture = null;
  try
  {
   Type type = Type.GetType(Name,true);
   MyFurniture = (IFurniture)Activator.CreateInstance(type);
  }
  catch (TypeLoadException e)
   Console.WriteLine("I dont know this kind of furniture,
      exception caught - {0}" ,e.Message);
   return MyFurniture;
 }
}然後在以用戶端進行程式調用:string FurnitureName = Console.ReadLine();
IFurniture MyFurniture;
FurnitureFactory MyFurnitureFactory = new FurnitureFactory();
MyFurniture = MyFurnitureFactory.MakeFurniture(FurnitureName);  就這樣預期想實現的,通過這樣就實現了.當然這個例子比較簡單,但是它卻通過原廠模式的思想實現了代碼的靈活性.應用軟體系統開發中,有許多地方可以考慮使用原廠模式.比如在寫資料層的代碼時候,考慮到程式的可移植性,可拓展性,面向不同的資料庫時,採用原廠模式不為是一件理想的實現方式.

                   


 

        ——文章資訊來自互連網 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.