2013-10-10 382 views
1

我面對關於抽象工廠出了問題,抽象工廠查詢

class AbstractProductFactory{ 
    public: 
     virtual ProductA* createProductA() = 0; 
     virtual ProductB* createProductB() = 0; 
}; 

我ConcreteProductFactory類覆蓋的是創造產品這兩個成員函數。

當我需要添加新的ProductC創建時,我正面臨一個問題。如果我添加一個新的虛函數ProductC* createProductC() = 0;,那麼所有現有的ConcreteProductFactory類都需要修改,這也是違反開放原則的。

解決此問題的最佳方法是什麼?

+0

爲什麼'AbstractProductFactory'函數可以創建'ProductA'和'ProductB'而不是'ProductC'函數呢? – Shoe

+0

它的要求是後者,我可以但在這種情況下,我必須修改所有的concretefactory類來覆蓋createProductC()函數,我已經提到了一件事情,它也是違反開放原則。我只想知道處理這種condn的理想方式,就像我們創建不同的productB對象一樣,後來新的需求需要更多不同的新productB對象,在這種情況下我們不需要創建不同的concreteProductFactory,我們可以使用Prototype模式來克服這樣的問題。我想我清楚你的疑惑。 – user2516685

回答

0

當然,所有concreteProductFactory都需要修改,這是這些工廠的要點。

每個工廠都以不同的方式創建SAME產品(與您當前使用的類相比)。

如果你不想這樣做,你不想使用抽象工廠模式。你想要達到什麼目的?

1

然後,您只需要創建一個ProductC需要一個新的接口。讓新的接口繼承舊的接口,修改這些類繼承新接口,然後在這些類上實現所需的方法。舊的代碼不會看到任何區別或改變。

class NextAbstractProductFactory: public AbstractProductFactory{ 
public: 
    virtual ProductA* createProductA() = 0; 
    virtual ProductB* createProductB() = 0; 
    virtual ProductC* createProductC() = 0; 
};