1

我正在制作一个返回我的对象​​的新实例的工厂方法。我想阻止任何使用我的代码的人在我的对象上使用公共构造函数。有没有办法做到这一点?

这通常是如何完成的:

public abstract class CarFactory
{
  public abstract ICar CreateSUV();
}

public class MercedesFactory : CarFactory
{
  public override ICar CreateSUV()
  {
    return new Mercedes4WD();
  }
}

然后我想限制/阻止其他开发人员(包括几个月后的我)制作 Mercedes4WD 的实例。但是让他们调用我的工厂方法。如何?

4

6 回答 6

2

您可以使该类Mercedes4WD成为具有内部构造函数的内部类,这将阻止它从包含工厂的库外部实例化。

你可能会更好地在你的类上使用一个工厂方法来生成实例,你可以从你的工厂类中调用它,但这与仅仅“更新”它并没有什么不同。

您还可以Mercedes4WD在一个程序集中拥有一个程序集,在另一个程序集中拥有工厂,在第三个程序集中拥有您的代码,然后工厂程序集可能是程序集的朋友,Mercedes4WD因此它可以创建实例,但主代码不会,所以它不能. 这将减少可以创建实例的范围,但一切都会变得更加复杂。

确实,您需要提供更多信息。当你说你想阻止人们以后构建时,你是在谈论其他开发人员在同一个代码库中工作吗?如果是这样,那么您真的无能为力。您也许可以在构造函数中进行一些检查,以查看堆栈中的下一个方法是否是工厂的方法,如果不是则抛出异常,但我不确定这是一个好主意......

真正的问题是你为什么要这样做?

于 2010-05-10T08:29:48.157 回答
1

你真的想要friend类的 C++ 等价物,但 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();
    }
}
于 2010-05-10T08:30:55.997 回答
0

听起来您的一般问题是一个类如何使一个方法可用于一个或多个其他类,而不使其可用于程序集中的所有类。假设没有对象以任何形式公开其直接构造函数,您可以使用静态委托实现您正在寻找的效果。

假设类 Foo 想要将其静态 Wozzle 方法公开给类 Bar 但没有其他人。Bar 应该有一个静态委托,用于调用 Foo.Wozzle。如果 Bar 需要调用 Foo.Wozzle 但尚未创建委托,它应该创建一个只有 Bar 知道的类型的新对象(称为“令牌”)并将其传递给静态方法 Foo.BarRequestsWozzle。该方法应该为 Foo.Wozzle 创建一个静态委托(如果尚未创建),并将该委托连同传入的令牌对象一起传递给 Bar.FooSuppliesWozzle。该方法应检查传入令牌的类型是否与提供给 BarRequestsWozzle 的类型相匹配,如果是,则适当地设置委托。Foo 不会将其 Wozzle 方法提供给除 Bar 之外的任何人,除了 Bar 之外,没有人可以创建正确的令牌类型,而 Bar 没有

于 2011-07-22T20:42:29.710 回答
0

您可以将 Mercedes4WD 类的默认构造函数定义为内部构造函数。因此,只能在定义了 Mercedes4WD 类型的程序集中调用默认构造函数。

于 2010-05-10T08:27:19.893 回答
0

对于工厂方法,将构造函数设为私有,但看起来您实际上是在实现工厂模式

于 2010-05-10T08:27:40.300 回答
0

将构造函数保持在内部或显式实现接口,以便不能直接实例化类。

于 2010-05-10T08:28:26.547 回答