2012-10-03 16 views

回答

2

首先,singletonobj是錯誤/令人困惑的名字。單身人士呼籲類別爲基礎,如:

Log::getInstance().doSomething(); 

,而不是

Log log = new Log; 
log.getInstance().doSomething(); 

所以這應該回答這個問題,但無論如何,我會詳細:)

Log::doSomething(); 

將迫使doSomething()是一種靜態方法,而

Log::getInstance().doSomething(); 
作爲實例方法,

具有doSomething()

爲什麼要用getInstance()?因爲單身人士根據其定義,應該只有零個或一個實例。通過將單身人員的構造函數設置爲private併發布getInstance()方法,它允許您控制此類的實例數量。私有構造函數僅僅是爲了避免其他類對這個類進行實例化,這將會破壞這個類作爲單例的目的,因爲你無法控制這個類有多少個實例。

+2

你錯過了C++標籤 –

+0

你知道這個問題是關於C++的,對嗎? –

+0

是的,沒有看到。無論如何,只有語法和細節纔會改變。概念是一樣的。 – m0skit0

1

看起來第一個例子是調用常規方法,而第二個例子是調用靜態方法。

Singleton設計模式可確保在任何給定時間僅實例化給定對象的單個實例。第一個示例返回所述實例,然後使用對象的實例調用方法。

第二個例子似乎使用的是不需要對象的實例的靜態方法,實際上無效Singleton設計模式...

+1

我看不出如何使任何東西無效。 –

+0

@ Joschc1107 - 我期望'singletonobj' **是**單個實例。所以'singletonobj。getinstance()'可能會再次返回'singletonobj'。儘管多餘(並且在作者對該模式的理解方面表現出相當大的差距),但它並不符合這種模式。 – ArjunShankar

+0

我的問題是爲什麼把靜態方法放到一個不需要對象實例的單例類中?也許無效是一個字太強,因爲該模式可以用其他方法實現。然而,我很好奇爲什麼人們會想要在同一個對象。除了損害可測試性之外,這會不會導致對象功能的異構混合?我的理解是,單例的目的是提供需要作爲共享資源池實例化一次的方法。如果一個方法不需要這些,它真的屬於那個對象嗎? – JoshC13

9

那麼,在技術上,singletonobj.getinstance()是多餘的,因爲這意味着你已經抓住了這個對象。

呼叫通常看起來是這樣的:

SingletonClass::getinstance().dosomething(); 

singletonobj.dosomething() 

的情況下,你預取的對象 - 即以前一樣

SingletonClass& singletonobj = SingletonClass::getinstance();