class A
实施IC
class B
实施IC
class Factory
有方法GetObject(int x)
; x=0
为A
,x=1
为B
。
如何强制使用Factory.GetObject
方法创建A
和B
类型的对象,并阻止类似new A()
的内容,Factory.GetObject(0)
{{1}} ?
答案 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类的组件无法直接创建它(只要它们不继承它......)。