C# C语言中的工厂方法模式

C# C语言中的工厂方法模式,c#,factory-method,C#,Factory Method,A类实现IC B类实现IC 类工厂有一个方法getObjectX;x=0表示A,x=1表示B 如何强制使用Factory.GetObject方法来创建类型A和B的对象,并防止出现类似新A的情况,即应该是Factory.GetObject0 如何强制使用Factory GetObject方法来创建A和B类型的对象,并防止出现新的A和B类型的对象 您不能强制使用Factory.GetObject,这是您应该在将A和B构造函数标记为内部后在提供的API文档中编写的内容 public class A:

A类实现IC B类实现IC

类工厂有一个方法getObjectX;x=0表示A,x=1表示B

如何强制使用Factory.GetObject方法来创建类型A和B的对象,并防止出现类似新A的情况,即应该是Factory.GetObject0

如何强制使用Factory GetObject方法来创建A和B类型的对象,并防止出现新的A和B类型的对象

您不能强制使用Factory.GetObject,这是您应该在将A和B构造函数标记为内部后在提供的API文档中编写的内容

public class A: IC
{
    internal A() { }
}

public class B: IC
{
    internal B() { }
}

public static class Factory
{
    public static IC GetObject(int x)
    {
        if (x == 0)
        {
            return new A();
        }

        if (x == 1)
        {
            return new B();
        }

        throw new ArgumentException("x must be 1 or 2", "x");
    }
}

这样,将无法从其他程序集访问这些构造函数。另外,不要忘记反射,它允许直接实例化那些类,不管你多么努力地隐藏它们。

我不确定它是否仍然相关已经一年了。。。但以下是如何实现工厂使用的进一步强制执行:

public class A
{
   internal protected A() {}
}

public class AFactory
{
   public A CreateA()
   {
      return new InternalA();
   }

   private class InternalA : A
   {
      public InternalA(): base() {}
   }
}

使用类A的组件不能直接创建它,只要它们不继承它……

为什么我们不将类A和B也设为内部类?@Genzer:因为您无法从公共方法返回内部类型?@Tanzelax,为什么不?在GetObject方法签名中,我们使用的是IC接口,它需要是公共的,但是A和B可以是内部的,没有任何问题;出于某种原因,我认为即使您将其作为公共接口返回,您也不能这样做。。。不知道我为什么会这样想。另一个想法是……按照惯例,您可以将工厂和实例类自己放在一个程序集中,这样对实例的任何调用总是或尽可能经常地从另一个程序集中进行。不是万无一失的,但可以作为一个长期的提醒,工厂将用于实例化。