C#中的工厂方法模式

时间:2011-04-09 07:12:26

标签: c# factory-method

class A实施IC
class B实施IC

class Factory有方法GetObject(int x); x=0Ax=1B

如何强制使用Factory.GetObject方法创建AB类型的对象,并阻止类似new A()的内容,Factory.GetObject(0) {{1}} ?

2 个答案:

答案 0 :(得分:10)

  

如何强制使用Factory GetObject方法创建A和B类型的对象并阻止类似新的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");
    }
}

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

答案 1 :(得分:4)

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

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

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

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

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