2012-09-02 28 views
3

我有一個工廠類,將用於創建一個特定類的很多實例。創建過程相當混亂,可能需要一段時間。所以我認爲存儲已經在工廠內創建的類的實例是明智的,我可以在以後回憶它們。爲了速度而犧牲const正確性可以嗎?

創建取決於一個參數(名稱),因此事物可以存儲在我稱爲old_instancesstd::map中。

A A_factory::make_A(std::string const& name) 
{ 
    if (old_instances.find(name) != old_instances.end()) 
    { 
     return old_instances.find(name) -> second; 
    } 
    else 
    { 
     // obfuscated creation process that creates instance 'new_A' 
     // ... 

     old_instances.insert(std::pair<std::string, A>(name, new_A)); // <- problem 
     return new_A; 
    } 
} 

這裏的問題是,這整個例程可能是工廠的const成員。但是因爲old_instances已經改編。

我有點覺得尷尬,犧牲const-這個微不足道的功能。 這些犧牲是合乎邏輯的嗎?

如果這個問題太過依賴品味,請不要拍我。

+2

make'old_instances' mutable – James

+0

看起來您正在重新創建自定義分配器或池存儲。見例如Boost池 – sehe

+0

順便說一下,這就是所謂的**延遲加載**,並且是另一種通常與工廠模式相關的設計模式。 –

回答

3

這是使用mutable的經典示例。只要外部行爲確實是const的,那麼你應該很好地做到這一點。

0

這取決於你 - 如果你認爲old_instances的狀態不會對你的類的客戶端代碼產生任何可觀察的/概念上的差異,那麼你可以使它變爲可變的,並使工廠函數爲const。但是你應該確保它是真實的,否則你只會混淆自己或其他人以後閱讀你的代碼。