2013-04-17 48 views
1

只是在鬼混,我有這個想法,這是一個很好的實現一個通用的工廠方法模式?這可以作爲一個通用工廠方法嗎?

工廠代號:

public static class Factory 
{ 
    public static T Create<T>() where T : new() 
    { 
     return new T(); 
    } 
} 

調用工廠別處:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var obj = Factory.Create<Person>(); 
      obj.Name = "Mark"; 
      Console.WriteLine(obj.Name); 

      var obj2 = Factory.Create<Animal>(); 
      obj2.AnimalType= "Dog"; 
      Console.WriteLine(obj2.AnimalType); 

      dynamic obj3 = Factory.Create<ExpandoObject>(); 
      obj3.Age= 20; 

      Console.WriteLine(obj3.Age); 

      Console.ReadKey(); 
     } 
    } 

我的意思是按預期工作......但你在這裏看到的任何問題?因爲我不...

任何意見將超過讚賞,因爲我打算利用工廠來實例化對象和這些似乎不錯..

在此先感謝:d

編輯:爲了澄清問題,我修改了工廠方法的名稱,因爲之前的名稱是GetInstance並且令人困惑。

+1

我不確定我是否真的瞭解Factory,因爲我只讀過「Head-first:設計模式」。但是,根據我的經驗,工廠應該生產一些產品具有相同的祖先(或實現相同的界面)。而你的工廠只限於「新()」條件。我認爲這意味着每個T都是Object的繼承者,但Object沒有提供Age,AnimalType或Name。在我看來,工廠應該是更多的條件T. –

+1

爲什麼動態爲obj3 –

+1

使用[autofac](http://code.google.com/p/autofac/)。當你爲相同類型調用GetInstance兩次時,你的工廠將返回一個新實例 –

回答

2

您的代碼在技術上是正確的,但IMO無用。你使用這個工廠沒有任何好處。對於您需要的每個新實例,使用新的更容易。所以,這是一個問題。

事實上,這幾乎是打敗了有工廠的原因。它不會返回抽象,也不適合構建昂貴的對象。此外,您的代碼將耦合到工廠。

DI容器,autofac非常好,幾乎是一個工廠,並且知道如何處理註冊到它的任何類型的實例化。此外,它可以用來注入任何你需要作爲依賴的事件。

總之,我會說對新的關鍵字用於簡單的情況和DI容器用於具有依賴關係的對象。你寫的Factory類和它的用法看起來更像是不好的代碼,所以不要在真正的應用程序中使用它。

+0

+1 for autofac :) –

0

這個例子很好,但我很難想象你真的需要這種情況。我想到的唯一用法是當你需要在每個對象創建操作時做一些日誌記錄或類似的事情。否則,你可以調用一個目標類型的構造函數。 Usualy您使用工廠創建實現通用接口的不同對象。因此,工廠的客戶不知道所使用的接口的確切實現,導致較少的耦合解決方案。基本上,工廠知道一些接口的具體實現,而工廠的用戶不知道,這是主要思想。

+1

通過autofac實現日誌記錄:builder.RegisterType () .OnActivated(e => e.Context.Resolve ().Log(「Object created」)); – MikeSW

+0

@MikeSW,我同意。一般來說,幾乎任何IoC容器都具有此功能,並且在大多數情況下,應該使用IoC容器而不是創建自定義工廠方法。 –