2009-02-11 226 views
6

我有一個帶有幾個派生類的ABC。要創建這些派生類我用的是工廠模式:工廠對象與工廠功能

.h文件中:

class derivedFactory 
{ 
public: 
    base* createInstance(); 
}; 

.cpp文件:

base* derivedFactory::createInstance() 
{ 
    return new derived(); 
} 

是否有任何優勢,這在僅僅有一個免費的功能:

.h文件中:

base* derivedFactoryFunction(); 

.cpp文件:

base* derivedFactoryFunction() 
{ 
    return new derived(); 
} 

另外:我使用依賴注入抽象工廠模式。我可能會使用基於ABC的繼承層次:

class objectCreator 
{ 
public: 
    base* create() = 0; 
}; 

是否有任何優勢,使用這種過度的函數指針:

boost::function<base*()> factory_ptr; 

使用boost ::綁定/λ,這似乎讓我的代碼更多的可組合,如果我希望我可以包裝一個真正的工廠對象。我可以看到,性能可能會有所下降,但這很值得擔憂,因爲它只是在啓動時調用。

回答

2

這取決於你的工廠需要多麼靈活。如果工廠需要外部信息(如來自配置文件,程序選項等)來確定如何構建對象,則比對象更合理。如果你所需要的只是在工廠的爭論中,那麼比起一個函數來說可能是好的。

我可以看到有一個指針的唯一好處是用於測試,您可以在其中使用不同的工廠函數。

+0

指針將允許實現抽象工廠模式。我已經在上面擴展了它 – 2009-02-17 09:50:33

1

具有與單一方法或指向方法的指針的接口是等價的。

但是在第二種情況下,你會惹上麻煩,如果你想其他方法來與療法第一個走......

和界面比在我看來方法指針更具可讀性。

然後你選擇了。

1

我想說的是將工廠函數作爲類中的靜態方法的好處在於,很明顯它是該類生命週期的一部分。將它分開意味着其他使用你的類的程序員必須尋找別的地方纔能找到工廠方法。

對不起,我不確定你的意思是通過傳遞函數指針到factor方法,但是如果你不需要,我通常不會使用函數指針。函數指針不能被內聯,因爲它們在編譯時不能被解析,這意味着它們可能會變慢。但除此之外,如果您已經確定在編譯時將調用哪個函數,那麼使用函數指針似乎就不太好。

1

你是否想過一種類型的工廠?如果是這樣,你需要工廠對象。