c#中的工厂方法模式

本文关键字:方法 模式 工厂 | 更新日期: 2023-09-27 17:49:37

class A实现IC
class B实现IC

class Factory有一个方法GetObject(int x);x=0 for A, x=1 for B .

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

c#中的工厂方法模式

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

你不能强制使用Factory.GetObject,这是你应该在API的文档中写的东西,你将A和B构造函数标记为内部。

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的组件不能直接创建它(只要他们不继承它…)