2014-10-16 52 views
0

工廠函數應該作爲靜態成員還是在命名空間中作爲自己的類?創建類工廠時,我必須使用兩個含義之間有什麼區別?工廠函數作爲類或命名空間中的靜態成員?

在我的情況下,工廠生成的類是具有不同內存結構支持的容器對象。像

template< typename T > 
class Parent 
{ 
    virtual void myFunction() = 0; 
    // more virtual interface functions... 
} 

template< typename T > 
class ChildA : public Parent<T> 
{ 
    virtual void myFunction() override; 
} 

template< typename T > 
class ChildB : public Parent<T> 
{ 
    virtual void myFunction() override; 
} 


template< typename T > 
Parent<T>* factory(PerformanceTraits traits); 

東西,我看了看Namespace + functions versus static methods on a class和還讀什麼斯科特邁爾斯不得不對這個問題說,但我似乎並沒有能夠將其應用到工廠的功能。

如果我使用一個命名空間,我可以寫

Parent* obj = MyFactoryNamespace::factory<int>(traits); 

相比

Parent* obj = MyFactoryClass<int>::factory(traits); 

如果我使用一個模板工廠類。除此之外,有兩種方法可以寫出同樣的東西,技術上的差異是什麼?

謝謝。

+0

我想你鏈接的問題已經很好的回答了。要記住的一件事就是測試:重新打開一個類比命名空間要困難得多。 – 2014-10-16 12:43:19

回答

0

這取決於。沒有真正的答案。在很多情況下,用戶只能看到的 類是抽象基類; 正在由工廠構建的實際類在源文件中的未命名名稱空間中聲明並定義爲 。在這種情況下, 很顯然,工廠函數將位於標題中聲明的名稱空間 中。如果在您的 應用程序中使用此模式,則應該保持一致,並在命名空間範圍內聲明 所有工廠函數。否則, 它更像是一種風格問題。做任何一個對你最好的感覺。 (但要一致。)

0

無論哪種方式,你只是得到一個愚蠢的名字的全球。但是大多數代碼讀者會期望它是它創建的東西的靜態成員,即Parent。對我來說,這將是一個熟悉的模式,但使用其他名稱空間似乎不相關和奇怪。