抽象工厂的多重继承

multiple inheritance for abstract factory

本文关键字:多重继承 工厂 抽象      更新时间:2023-10-16

抽象工厂的例子是生产日本汽车,有左车门、右车门和发动机罩等。

由于我经常使用C++,所以我总是直接思考它。LeftDoor、RightDoor和Hood类,对于Model1左门,Model2左门继承LeftDoor类,RightDoor和Hood也是。如果我们想创造本田,我们只需要继承,比如本田->Model1左门,Model2右门,Model3引擎盖。那么它就完成了。

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

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

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都有一个CD_4和RightDoor

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

对于您给出的示例,我将实现Composition over Heritage,因为本田汽车与车门没有is-a关系。但不是有关系。

如果我们想创造本田,我们只需要继承,比如本田->Model1左门,Model2右门,Model3引擎盖。那么它就完成了。

你的逻辑有问题。汽车不是门。继承意味着"IS"关系。如果"A"继承了"B",则"A"是"B"的类型。另一个问题是车门和发动机罩是可选部件。若你们拆下一个车门,那个么汽车仍然是汽车,而且你们可以用不同的部件替换车门。你需要改变思维方式。在这种情况下,汽车有门,但它不是门。

多重继承的一个更合适的用法是当你有"两栖车辆"的类,并且它继承了"陆地车辆"answers"船"的情况。

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