2012-08-05 97 views
1

我有一系列我希望通過「根」實用程序(對象)公開的Factory對象。這個根實用程序本身就是...工廠。作爲一個實用對象,我希望將它作爲一個靜態類來實現。然而,使用我目前的設計是不可能的,因爲你不能在界面中實現靜態成員。你如何創建靜態工廠?

所以......

我的問題是:我怎樣才能改變下面的類以獲取靜態工廠上面的影響?

代碼如下:

public interface IFactory 
{ 
    I Create<I>(); 

    IFactoryTransform Transformer { get; } 
    IFactoryDataAccess DataAccessor { get; } 
    IFactoryValidator Validator { get; } 
} 

public static class Factory : IFactory 
{ 
    static Factory() 
    { 

     Transformer = new FactoryTransform(); 
     DataAccessor = new FactoryDataAccess(); 
     Validator = new FactoryValidator(); 
    } 

    public I Create<I>() 
    { 
     var model = typeof(I); 

     // Activation code will go here... 

     throw new NotSupportedException("Type " + model.FullName + " is not supported."); 
    } 

    public IFactoryDataAccess DataAccessor { get; private set; } 
    public IFactoryTransform Transformer { get; private set; } 
    public IFactoryValidator Validator { get; private set; } 
} 
+0

你可以檢查這個帖子http://miroprocessordev.blogspot.com/2011/12/design-patterns-series-7-singleton.html創建一個單身模式,我認爲你不必實例化你的對象在構造函數 – 2012-08-05 12:36:33

回答

4

您可以從將您靜態關鍵字上課一級。例如,你可以有一個static class Utils,你有一個單身屬性MyFactory

public static class Utils 
{ 
    public static IFactory MyFactory {get; private set} 
    static Utils() 
    { 
     MyFactory = new Factory(); 
    } 
} 

//usage 
var myInterface = Utils.MyFactory.Create<IMyInterfrace>() 

這就是說,我可能會使用DI而不是工廠和IoC容器來管理對象的生命週期。

0

這是不可能的,一個靜態類從接口繼承。我認爲你真正想要的是一個單身生命週期工廠。

+0

你可以請一個簡單的例子嗎? – 2012-08-05 12:34:33

+0

這是一個抽象工廠類型的概念嗎?看看這裏:http://stackoverflow.com/questions/1993397/abstract-factory-pattern-on-top-of-ioc – 2012-08-05 12:38:15

0

爲什麼不使用微軟的統一和依賴注入是一個更好的做法比自己管理的靜態工廠: http://msdn.microsoft.com/en-us/library/ff649614.aspx 這將是統一的框架,將實例爲你所有的對象

IUnityContainer myContainer = new UnityContainer(); 
FactoryDataAccess da= new FactoryDataAccess(); 
myContainer.RegisterInstance<IFactoryDataAccess >(da); 

當你調用它,它會使用FactoryDataAccess例如:

IFactoryDataAccess myServiceInstance = myContainer.Resolve<IFactoryDataAccess >(); 
+0

或任何其他的DI框架。 – Steven 2012-08-05 12:59:07