2012-08-05 62 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