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
方法来创建类型为A
和B
的对象,并防止类似new A()
的东西,这应该是Factory.GetObject(0)
?
如何强制使用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的组件不能直接创建它(只要他们不继承它…)