【问题标题】:How to Restrict creation of objects from certain class如何限制从某个类创建对象
【发布时间】:2012-08-01 18:38:18
【问题描述】:

我有一个“银行”类和一个“分行”类。 “分支”继承自“银行”。我只想允许“银行”对象创建新的“分支”对象。 (例如,只有花旗集团可以开设新的花旗银行分行)。

实现这一目标的最佳设计模式是什么?

我目前正在使用带有私有构造函数的朋友类。但我不确定这是否是正确的做法。

【问题讨论】:

  • 你确定你真的想要这样做吗,这会让为Branch编写测试变得更加困难?也许您想要的只是让Branch 构造函数将Bank 作为参数?
  • 是的,测试会更难..但是任何代码都可以将任何分支分配给任何银行..这是我希望限制的。
  • 设计中有一个概念问题,一个Branch不是一个Bank,它只是一个branch那个特定的银行

标签: c++ inheritance private-constructor


【解决方案1】:

“分支”继承自“银行”

这是你的问题,你正在使用继承。您正在寻找一种抽象工厂模式,其中Bank 是分支创建者,并且仅向其各自的创建者提供对分支构造函数的访问。

struct Branch  //abstract
{
    virtual ~Branch() = 0;
};
class CitiBranch : Branch
{
    friend class Citi; //only Citi can create instances of CityBranch
private:
    CitiBranch();
};

struct Bank
{
    virtual ~Bank() = 0;
    virtual Branch* createBranch() = 0;
}

struct Citi : Bank
{
    virtual Branch* creatBranch()
    {
        return new CityBranch;
    }
}

这个程序是一个接口而不是一个具体的类。所以你有Branch 指针和Bank 指针,并不需要知道它们的确切类型。

如果你有一个Bank* 并调用createBranch(),你会得到一个Branch*,但它会指向一个正确的具体对象。

【讨论】:

  • 这行得通。我也在使用类似的模式朋友和私有构造函数。我也使用了继承,因为“分支”共享“银行”的许多属性,例如徽标、使命宣言……
  • @apostopher 这是不必要的信息重复,因为您将拥有许多具有相同信息的分支。我只是将该信息保存在 Bank 类中,并让分支机构可以访问它,而不是继承它。
  • 是个好主意。我也同意@DavidRodríguez。所以这里的继承是错误的..
  • @apostopher 好吧,即使您采用不同的设计,继承显然是错误的。分行绝对不是银行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多