抽象工厂
的抽象工厂的例子多重继承是生产日本人的汽车,也有左门,右门和敞篷等抽象工厂
由于我使用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
具有LeftDoor
和RightDoor
。
工厂仅创建Car
实例。因此,如果您调用CarFactor::createCar("Honda");
,它将返回Honda
的实例。
但并非所有车辆都包含完全相同的零件。有些车有两扇门,其他车有四扇门。如果将它设置为一个Car类,那么Car类会很庞大,也许本田只是使用它的一小部分。 – will 2012-03-08 21:58:28
@你可以制作组件列表而不是单独的成员。 – 2012-03-08 22:28:38
@我编辑我的答案以反映我的意思。 – 2012-03-08 22:58:02
对于您给出的例子,我将实施Composition over Inheritance,因为本田汽车没有与门有关系。但不是有一种关系。
那么如果我们想创造本田,我们只需要继承,比如本田 - > Model1左门,Model2右门,Model3引擎盖。那么就完成了。
您的逻辑存在问题。汽车不是一扇门。继承意味着“IS”关系。如果“A”继承“B”,则“A”是类型的“B”。另一个问题是门和引擎盖是可选部件。如果你撬开一扇门,汽车仍然是汽车,再加上你可以用不同的部件更换门。你需要改变思维方式。在这种情况下,汽车有一扇门,但它不是一扇门。
多重继承的更合适的用法是当你有“水陆两用车辆”级别并继承“LandVehicle”和“Boat”时。
至于你的“汽车模型”的情况,你需要一个包含组件列表的汽车类。然后,您需要为不同的汽车模型创建不同的组件。这些集合可以作为参数供给“建造者”(参见“建造者”模式),以便制作你想要的汽车。
很难说出你在这里问什么。你问汽车是否应该从所有零件继承? – Tim 2012-03-08 20:10:55