2012-07-13 112 views
1

假設有如下的工廠。我想知道是否有可能不包含ObjectA.h和ObjectB.h。工廠設計模式問題

目錄結構
工廠

| -----對象A

| -----對象B

因爲我不想以包括子頭文件目錄,有沒有辦法做到這一點? 如果有新的objectC,則不需要修改工廠類。如果類型是「TypeC」,它將自動創建ObjectC。

#include "ObjectA.h" 
#include "ObjectB.h" 

object* create(const string& type) 
{ 
    if (type == "typeA") 
    { 
     return new ObjectA(); 
    } 
    else 
    { 
     return new ObjectB(); 
    } 
}; 
+0

這可能對你有用,請看這裏http://www.codeproject.com/Articles/363338/Factory-Pattern-in-Cplusplus和這裏http://stackoverflow.com/questions/ 8719119 /壞實踐返回唯一ptr爲原始類指針所有權語義 – rsc 2012-07-13 06:44:17

+0

謝謝。這真的很有幫助。但是,註冊函數調用在工廠的構造器中。我只是想知道把它放在具體的課堂上是否可行。 – 2012-07-13 09:01:16

回答

1

是的,將實現分離爲一個實現文件,並且只包含那裏的文件,只在頭中提供函數原型。

要實際呼叫new ObjectA();new ObjectB();,您的必須將包括在呼叫站點中。

//factory.h 
object* create(const string& type); 

//factory.cpp 
#include "factory.h" 
#include "ObjectA.h" 
#include "ObjectB.h" 

object* create(const string& type) 
{ 
    if (type == "typeA") 
    { 
     return new ObjectA(); 
    } 
    else 
    { 
     return new ObjectB(); 
    } 
}; 
+0

如果工廠包含一個註冊表,並且所有'object'派生類在使用之前都被註冊了,那麼這個代碼可以大大改進。這將消除工廠功能中的「if-else」或「switch」。 – TemplateRex 2012-07-13 06:36:57

+0

@rhalbersma - 我以前也是這麼想的。但是你付出的代價是某種全球性的對象/單身 - 這會導致以後各種各樣的痛苦。國際海事組織更新單個文件是一個更便宜的價格支付..或者您可以生成該工廠.cpp文件作爲您的構建過程的一部分。 – 2012-07-13 06:46:32

+0

@MichaelAnderson你不必爲工廠使用單例/全局變量。您還可以將註冊表存儲在堆棧中的對象上,或者 - 通常情況下是這樣 - 如果您需要讓工廠比其使用的範圍更長,則可以將其包裝在shared_ptr中。 – TemplateRex 2012-07-13 08:36:47