2010-07-23 117 views
1

我奮力理解爲什麼pprocessor的初始化,下面,是這樣寫的:這段代碼的目的是什麼?

class X 
{ 
... 
private: 
    boost::scoped_ptr<f_process> pprocessor_; 
}; 

X:X() 
: pprocessor_(f_process_factory<t_process>().make()) //why the factory with template 
{...} 

,而不是僅僅寫

X:X() 
: pprocessor_(new t_process()) 
{...} 

其他相關代碼:

class f_process { 
    ... 
}; 

class t_process : public f_process { 
    ... 
}; 


// 

class f_process_factory_base { 
public: 
    f_process_factory_base() { } 
    virtual ~f_process_factory_base() = 0 { } 
    virtual f_process* make() = 0; 
}; 

template < typename processClass > 
class f_process_factory : public f_process_factory_base { 
public: 
    f_process_factory() { } 
    virtual ~f_process_factory() { } 
    virtual processClass* make() { return new processClass(); } 
}; 

編寫代碼的人非常聰明,所以也許有一個很好的理由。
(我不能聯繫他問)

回答

2

由於它是,它似乎有點毫無意義,但我認爲這裏沒有顯示的幾個可能的用途,但可能在未來有用:

  • 內存管理:這是可能在未來的某個時刻,原作者預計需要t_process的不同分配方案。例如,他可能想要重用舊對象或從競技場分配新對象。

  • 創建跟蹤:創建對象時可能會收集f_process_factory對象的統計信息。也許工廠可以保持一些靜態。

  • 綁定構造函數的參數:也許在未來的某個時候,f_process_factoryt_process的專業化需要通過構造函數的參數爲​​t_process創造者,但X並不想知道他們。

  • 爲依賴注入做準備:可能會專門化這些工廠來返回模擬,而不是真正的t_process。這可以通過幾種方式來實現,但不完全如書面。

  • 專門創建對象:(這實際上只是前兩個一般情況下),可能是獲得在不同情況下產生的t_process特 - 例如,它可能會產生不同的t_process類型的基於環境變量或操作系統。這需要工廠的專業化。

如果是我的話,並沒有這些看似有理,我可能會撕了出來,因爲它似乎是無償的設計模式的使用。

2

這看起來像他正在使用factory design pattern來創建t_process的新實例。這將允許你將創建不同類型的t_process的責任從類X中移除

+0

除了它不創建不同類型的't_process'。它調用一個調用'new t_process();'的't_process'工廠,'t_process'類是具體的。 – Stephen 2010-07-23 04:06:58

+0

你怎麼能確定它使用的工廠,如果有多個工廠呢?所有的工廠方法都不是靜態的。它可能指向與示例代碼中提到的不同的類,並使用多態性創建流程實例。 – 2010-07-23 04:19:55

+0

我可以肯定,因爲它在'pprocessor_'的初始化中構建了一個臨時't_process'工廠,然後調用'make()':) – Stephen 2010-07-23 04:22:46

1

那麼,在這種情況下,它沒有多大意義,除非作者期望默認工廠的定義將在將來的某個時間更新。但是,如果工廠對象作爲參數傳入,那將是有意義的;工廠爲您提供了構建對象的更多靈活性,但是如果您在與使用工廠相同的地方實例化工廠,那麼它確實不具備優勢。所以,你是對的。