工厂方法模式和公共构造函数

时间:2010-05-10 08:24:31

标签: .net design-patterns factory public-method

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

这通常如何实现:

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

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

然后,我想限制/阻止其他开发人员(包括我在几个月内)制作Mercedes4WD的实例。但让他们称我的工厂方法。怎么样?

6 个答案:

答案 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之外的任何人提供他的令牌。

相关问题