【问题标题】:How do you create Static Factories?你如何创建静态工厂?
【发布时间】:2012-08-05 12:28:29
【问题描述】:

我希望通过“根”实用程序(对象)公开一系列工厂对象。这个根实用程序本身就是一个工厂。作为一个实用对象,我希望将它实现为一个静态类。但是,使用我当前的设计是不可能的……因为你不能在接口中实现静态成员。

所以...

我的问题是:我怎样才能改变下面的类来获得上面的静态工厂影响?

代码看起来像:

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; }
}

【问题讨论】:

标签: c# design-patterns factory-pattern


【解决方案1】:

您可以将 static 关键字从 Factory 类移动到上一级。例如,您可以有一个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 容器来管理对象的生命周期。

【讨论】:

    【解决方案2】:

    静态类不可能从接口继承。我认为你真正想要的是一个单例生命周期工厂。

    【讨论】:

    【解决方案3】:

    为什么不使用 Microsoft 统一和依赖注入,这比管理自己的静态工厂更好: 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 >();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      相关资源
      最近更新 更多