2012-05-10 19 views
0

我有一個用於軟件設置的單例類。在大型軟件的不同位置,可以使用getInstance並使用它來訪問已經從文件讀入設置類的設置。但是:單例方案,用不同的參數重載getInstance?

  • 在初始呼叫,有必要通過一個「型號名稱」(軟件加載和運行仿真模型)和基於名稱,該軟件將加載所選型號的設置。

    設置::的getInstance(「號樓」)

  • 在以後的調用,所以不希望(或有時可能)來傳遞「型號名稱」一次。所以如果我們可以在沒有型號名稱的情況下打電話,這將是理想的。

在這種情況下應該怎麼做?有2個getInstance方法?或者在將第一次調用getInstance之前將「模型名稱」設置爲Settings類中的靜態變量?或者是什麼?

+4

使用Singleton - >不同情。 – Puppy

+0

也許只是不使用單身? – ybungalobill

回答

2

有2 getInstance()方法聽起來像一個災難的食譜:)我會想象這個類的用戶總是會問:「那麼我使用哪一個?如果有人首先調用了錯誤的版本,會發生什麼?

而不是使用2 getInstance()方法,我認爲最好是使用靜態變量方法,並在初始化階段儘早設置它。但這也很容易出錯。

更好的辦法是考慮某種在實例化時使用模型名稱並在內部具有單例的工廠。工廠可能是這樣的:

class SettingsFactory 
{ 
public: 
    SettingsFactory(const std::string &modelName); 
    Settings *getUniqueSettingsInstance(); 

private: 
    SettingsFactory(); // cant instantiate the default ctor 

    // put the singleton stuff here 
}; 
+0

工廠方法聽起來對我來說是正確的解決方案。 –

+0

@SteveTownsend,Ya,我同意,我重新回答了一下。 – Brady

+0

我也喜歡工廠的方法。讓我思考一下,看看我應該如何幹淨地實施它。 – wmac

0

如果我理解正確的話,你爲什麼不只是超載與NULL默認值getInstance()這個方法?當您再次調用getInstance時,模型名稱是否爲NULL char*應該無關緊要,因爲這次您不需要它來構造對象。

class Settings 
{ 
    // .. 
    static Settings * getInstance(char * modelName = NULL); 
} 
+0

不錯的主意,但是如果它已經被實例化並且有人在modelName中傳遞,會發生什麼?他們會期望發生某些事情,但最有可能的情況是不會發生的。 – Brady

+0

@Brady - 我會很想把在那種情況下斷言,其實我的看法是,該OP不應該使用在所有單身,但我認爲這將在整體上工作。 – Benj

+0

@Benj - 什麼是從大型程序的不同部分訪問設置的另一種方法(並且避免每次都讀取設置文件,因爲我指的是軟件不同部分每秒鐘數百萬次的設置)。 – wmac

2

我不是一個說單身是邪惡的,但在這裏,你真的不應該使用它們。一般的經驗法則:如果你的班級有某種狀態從外部以任何方式感知,它不應該是一個單身人士。由於衆所周知的原因應該避免全局狀態。

你的班級顯然有狀態,因爲它需要一些初始化。不要讓它成爲單身。尋找其他方式來構建你的代碼。

+0

+1,我會說:單身是邪惡的。那麼,通常... –

相關問題