【问题标题】:multiple inheritance for abstract factory抽象工厂的多重继承
【发布时间】:2012-03-26 07:34:06
【问题描述】:

抽象工厂的例子是生产日本车,有左门、右门和引擎盖等。

由于我经常使用 C++,所以我总是直接想到它。 LeftDoor、RightDoor 和 Hood 类,对于 Model1 左门,Model2 左门继承 LeftDoor 类,RightDoor 和 Hood 也是如此。那么如果我们要创建Honda,我们只需要继承,比如Honda -> Model1 Left door, Model2 right door, Model3 hood。然后就完成了。

所以我的问题是我们可以这样做吗?如果可以,为什么要使用抽象工厂?

【问题讨论】:

  • 在这里很难说出你在问什么。您是在问汽车是否应该继承所有零件?

标签: c++ design-patterns multiple-inheritance


【解决方案1】:

您应该在这里使用组合而不是继承。

class Component;

class Door : public Component;

class LeftDoor : public Door;
class RightDoor : public Door;

class Car
{
   vector<ComponentPtr> components;
}
class Honda : public Car
{
}

class CarFactory
{
   CarPtr   createCar(std::string make);
}

这是因为Honda是一个Car,每个Car都有一个LeftDoorRightDoor

工厂只创建Car 实例。因此,如果您调用CarFactor::createCar("Honda");,它将返回Honda 的实例。

【讨论】:

  • 但并非所有汽车都包含完全相同的零件。有的车有两扇门,有的有四扇门。如果你将它设置为一个 Car 类,那么 Car 类会很大,也许本田只使用了它的一小部分。
  • @您可以列出组件而不是单独的成员。
  • 你的意思是给汽车一些必要的零件,比如引擎盖、发动机,并给其他选择,比如两扇门?
  • @将或者更好的是,给汽车一个组件集合,就像我编辑的答案一样。
  • 您认为 Sigterm 建议的 Builder 模式会是构建组件的好方法吗?
【解决方案2】:

对于您给出的示例,我将实施组合而不是继承,因为本田汽车与门没有 is-a 关系。但不是有关系。

【讨论】:

    【解决方案3】:

    那么如果我们要创建Honda,我们只需要继承,比如Honda -> Model1 Left door, Model2 right door, Model3 hood。然后就完成了。

    你的逻辑有问题。车不是门。继承意味着“IS”关系。如果“A”继承“B”,那么“A”类型的“B”。另一个问题是门和引擎盖是可选组件。如果你撕掉一扇门,汽车仍然是汽车,而且你可以用不同的部件更换门。你需要改变思维方式。在这种情况下,汽车有门,但它不是门。

    当您有“两栖车辆”的类并且它继承“陆地车辆”和“船”时,更合适的多重继承用法是这样的。

    至于您的“汽车模型”情况,您需要一个包含组件列表的汽车类。然后你需要为不同的车型创建不同的组件集。这些集合可以作为参数提供给“建造者”(参见“建造者”模式),以制造您想要的汽车。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      相关资源
      最近更新 更多