2012-03-08 159 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」時。

至於你的「汽車模型」的情況,你需要一個包含組件列表的汽車類。然後,您需要爲不同的汽車模型創建不同的組件。這些集合可以作爲參數供給「建造者」(參見「建造者」模式),以便製作你想要的汽車。