我正在制作一个返回我的对象的新实例的工厂方法。我想阻止任何使用我的代码的人在我的对象上使用公共构造函数。有没有办法做到这一点?
这通常如何实现:
public abstract class CarFactory
{
public abstract ICar CreateSUV();
}
public class MercedesFactory : CarFactory
{
public override ICar CreateSUV()
{
return new Mercedes4WD();
}
}
然后,我想限制/阻止其他开发人员(包括我在几个月内)制作Mercedes4WD的实例。但让他们称我的工厂方法。怎么样?
答案 0 :(得分:2)
你可以使类Mercedes4WD
成为一个内部构造函数的内部类,它将阻止它从包含工厂的库外部实例化。
你可能最好在你的班级上有一个工厂方法来生成实例,你可以从你的工厂类调用它,但这与仅仅“新建”它没有什么不同。
您也可以在一个程序集上使用Mercedes4WD
,在另一个程序集中使用工厂,在第三个程序集中使用您的代码,然后工厂程序集可以是Mercedes4WD
程序集的朋友,这样它就可以创建实例,但主要代码不会这样,它不能。这将减少创建实例的范围,但一切都会复杂一些。
您真的需要提供更多信息。当你说你想停止后来构建的人时,你是在谈论在同一个代码库中工作的其他开发人员吗?如果是这样,你可以做的不是那么多。您可能能够在构造函数中进行一些检查,以查看堆栈中的下一个方法是否是工厂的方法,如果没有则抛出异常,但我不确定这是个好主意......
真正的问题是你为什么要这样做?
答案 1 :(得分:1)
你真的希望C ++等同于friend
类,但C#没有它们。您始终可以将构造函数设为私有,并将静态工厂方法添加到Mercedes4WD
。这样可以防止“意外”直接建设:
public class Mercedes4WD : ICar
{
private Mercedes4WD()
{
// ...
}
public static Mercedes4WD Create()
{
return new Mercedes4WD();
}
}
public abstract class CarFactory
{
public abstract ICar CreateSUV();
}
public class MercedesFactory : CarFactory
{
public override ICar CreateSUV()
{
return Mercedes4WD.Create();
}
}
答案 2 :(得分:0)
您可以将Mercedes 4WD类的默认构造函数定义为内部。因此,默认构造函数只能在定义Mercedes 4WD类型的程序集中调用。
答案 3 :(得分:0)
对于工厂方法,将构造函数设为私有,但看起来您实际上正在实现工厂模式
答案 4 :(得分:0)
保持构造函数内部或显式实现接口,以便不能直接实例化类。
答案 5 :(得分:0)
听起来您的一般问题是类如何使一个方法可用于一个或多个其他类,而不使其可用于程序集中的所有类。假设没有任何对象以任何形式公开其直接构造函数,您可以使用静态委托来实现您正在寻找的效果。
假设类Foo想要将其静态Wozzle方法暴露给类Bar,但没有其他人。 Bar应该有一个静态委托,用于调用Foo.Wozzle。如果Bar需要调用Foo.Wozzle但是尚未创建委托,它应该创建一个只有Bar知道的类型的新对象(称之为“标记”)并将其传递给静态方法Foo.BarRequestsWozzle。该方法应为Foo创建静态委托。如果尚未创建,则将该委托与传入的令牌对象一起传递给Bar.FooSuppliesWozzle。该方法应该检查传入令牌的类型是否与给予BarRequestsWozzle的类型匹配,如果是,则适当地设置委托。除了Bar之外,Foo没有给任何人提供它的Wozzle方法,除了Bar之外没有人可以创建正确的令牌类型,并且Bar不会向除Foo之外的任何人提供他的令牌。