2013-10-01 73 views
3

我是一個相對較新的C++程序員。
在編寫一些代碼時,我在概念上創建了與下面的代碼類似的東西。當一個朋友指出這實際上是一個工廠模式,我讀到關於這個模式並且看到它是相似的。在C++中使用靜態方法來實現工廠模式

在我發現的所有例子中,工廠模式總是使用單獨的類實現,如class BaseFactory{...};,而不是我使用靜態create()成員函數實現的。

我的問題是:
(1)這實際上是工廠模式嗎? (2)代碼似乎工作。在我實施它的方式中有什麼不正確的嗎? (3)如果我的實現是正確的,那麼實現靜態create()函數的優點和缺點是什麼,而不是單獨的BaseFactory類。

謝謝!

class Base { 
    ... 
    virtual ~Base() {} 
    static Base* create(bool type); 
} 

class Derived0 : public Base { 
    ... 
}; 

class Derived1 : public Base { 
    ... 
}; 

Base* Base::create(bool type) { 
    if(type == 0) { 
     return new Derived0(); 
    } 
    else { 
     return new Derived1(); 
    } 
} 

void foo(bool type) { 
    Base* pBase = Base::create(type); 
    pBase->doSomething(); 
} 
+0

不容易擴展,如果我想添加一個新的派生類型,我不得不修改原始工廠而不是創建一個新的工廠類。如果工廠生活在我無法控制的第三方庫中,那麼根本無法做到這一點。因此,通常的設計基於繼承。 – syam

+0

@syam是抽象工廠,不是工廠 –

+0

@BЈовић啊對。我想我從不使用「普通」工廠模式,因此我的困惑... – syam

回答

3

這不是實現工廠模式的典型方式,主要原因是工廠類通常不是它創建的類的基礎。什麼時候使用繼承的通用指南是「確保公共繼承模型」是 - 「」。在你的情況下,這意味着Derived0Derived1類型的對象也應該是Base類型,而派生類應該表示比Base更專門的概念。

但是,工廠模式幾乎總是涉及繼承,因爲工廠將返回一個指向基類型的指針(你也這樣做)。這意味着客戶端代碼不需要知道工廠創建的對象類型,只需要它匹配基類的接口。

關於具有靜態創建功能,它取決於具體情況。正如您的示例所示,一個優勢是您無需創建工廠實例即可使用它。

+0

注意到他的「工廠」返回一個指向基類的指針 –

1

你的工廠是確定的,除了你合併工廠和接口,打破了SRP原則的事實。

不是在基類中創建靜態方法,而是在另一個(工廠)類中創建它。