0

class A工具IC
class B工具IC

class Factory有方法GetObject(int x)x=0对于A,x=1对于B.

如何强制使用Factory.GetObject方法来创建类型的对象AB防止类似的东西new A(),应该是Factory.GetObject(0)

4

2 回答 2

10

如何强制使用 Factory GetObject 方法来创建 A 和 B 类型的对象并防止类似 new A()

您不能强制使用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");
    }
}

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

于 2011-04-09T07:18:15.327 回答
4

我不确定它是否仍然相关(已经一年了......),但这里是你如何实现工厂使用的进一步执行:

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

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

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

使用类 A 的组件不能直接创建它(只要它们不继承它......)。

于 2012-03-27T10:18:20.700 回答