抽象工厂的例子是生产日本汽车,有左门,右门和胡德等。
由于我经常使用C ++,所以我总是直接考虑它。 LeftDoor,RightDoor和Hood类,以及Model1左门,Model2左门继承LeftDoor类,RightDoor和Hood也是如此。那么如果我们想创造本田,我们只需要继承,比如本田 - > Model1左门,Model2右门,Model3引擎盖。然后就完成了。
所以我的问题是我们能这样做吗?如果我们可以,为什么我们使用抽象工厂?
答案 0 :(得分:3)
你应该在这里使用构图而不是继承。
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
都有 LeftDoor
和{{ 1}}。
工厂只创建RightDoor
个实例。因此,如果您调用Car
,它将返回CarFactor::createCar("Honda");
的实例。
答案 1 :(得分:2)
对于您给出的示例,我将实施Composition over Inheritance,因为本田汽车与门没有is-a关系。但不是有关系。
答案 2 :(得分:0)
那么如果我们想要创造本田,我们只需要继承,比如本田 - &gt; Model1左门,Model2右门,Model3引擎盖。然后就完成了。
您的逻辑存在问题。汽车不是门。继承意味着“IS”关系。如果“A”继承“B”,则“A”是类型“B”。另一个问题是门和罩是可选部件。如果你扯掉一扇门,汽车仍然是汽车,另外你可以用不同的部件更换车门。你需要改变思维方式。在这种情况下,汽车有一扇门,但它不是一扇门。
当你拥有“两栖车辆”的类并且它继承了“LandVehicle”和“Boat”时,更适合使用多重继承。
至于您的“汽车模型”情况,您需要一个包含组件列表的汽车类。然后,您需要为不同的汽车模型创建不同的组件集。这些集合可以作为参数提供给“构建者”(参见“构建器”模式),以便制作您想要的汽车。