2012-03-08 162 views
1

的抽象工厂的例子多重继承是生产日本人的汽车,也有左门,右门和敞篷等抽象工厂

由于我使用C++了很多,我一直以为它直接的方式。 LeftDoor,RightDoor和Hood类,而Model1左门,Model2左门继承LeftDoor类,RightDoor和Hood也是如此。那么如果我们想创造本田,我们只需要继承,比如本田 - > Model1左门,Model2右门,Model3引擎盖。那么就完成了。

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

+0

很难说出你在这里问什么。你问汽车是否应该从所有零件继承? – Tim 2012-03-08 20:10:55

回答

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); 
} 

这是因为HondaCar,并且每个Car具有LeftDoorRightDoor

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

+0

但并非所有车辆都包含完全相同的零件。有些车有两扇门,其他车有四扇门。如果将它设置为一个Car类,那么Car类会很庞大,也许本田只是使用它的一小部分。 – will 2012-03-08 21:58:28

+0

@你可以制作组件列表而不是单独的成员。 – 2012-03-08 22:28:38

+0

@我编辑我的答案以反映我的意思。 – 2012-03-08 22:58:02

2

对于您给出的例子,我将实施Composition over Inheritance,因为本田汽车没有与门有关系。但不是有一种关系。

0

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

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

多重继承的更合适的用法是当你有“水陆两用车辆”级别并继承“LandVehicle”和“Boat”时。

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