继承是设计建造者/工厂的好工具

时间:2012-06-05 12:44:04

标签: c++ design-patterns factory builder

我有几个复杂的类,它们是使用从要创建的类继承的独立创建者类构建的。

一个例子可能是从无序数据构建的图。

class Graph{
  //....
  public:
   void showData(); 
  protected: 
    std::vector<std::pair<int,int> > mConnectedData;

}

class GraphCreator:private Graph{
  public:
    //...
    void construct();
  private:
   std::map<double,int> mSomeHelperContainer;
   //...
}

对于构造,我需要许多辅助函数以及辅助数据,我将其放在另一个类GraphCreator中。由于许多与图形相关的函数也是必需的,因为我在任何情况下都需要图形数据,所以我使用私有继承。 因为这绝不是着名的is-a关系,因为私有继承通常被认为是糟糕设计的暗示我有一些疑问: 这是一个好主意和一个适当的设计工厂的方法,还是有一些我没想过的主要缺点? 什么是设计这样一个工厂的更好方法?

修改

感谢目前为止的答案! 一些其他信息使得当前使用方法的原因更加清晰。 我不能使用静态创建方法(Creator中的状态变量太多),我有另一个约束: 我想在图书馆中向其他人提供独立于创作者的图表(例如,与文件中的读取方法一起)。 那些人不应该关心创作者。因此,我对朋友的使用有点不确定,因为它在Graph类中添加了代码。

2 个答案:

答案 0 :(得分:3)

这不是一个好方法(从数据很少的任何东西继承)。

传统方法是:

  • GraphCreator friend Graph
  • static(直接)
  • 中将该方法实施为Build Graph方法

决定主要取决于你是否需要“工厂”是有状态的。 class用于表示状态,方法无法做到。

  • 因此,如果您需要状态,则需要class来存储它,因此GraphCreator是您最好的选择。
  • 对于无状态方法,static方法更轻量级。

如果您尚未决定,请选择最简单的(static方法)并查看其进展情况:)

答案 1 :(得分:2)

我从here采用的经验法则是

  

尽可能使用合成,必要时使用私有继承。

“你必须”的一个具体例子是,你继承的类具有一些虚拟或纯虚函数,你必须实现这些函数才能使用你的私有库:如果没有继承,你根本就做不到。

从您的描述中看,使用继承是不可避免的;因此,我认为最好使用合成。