我碰到過單身模式。 我無法理解getinstance()在單例中究竟做了什麼?
singletonobj.getinstance().dosomething() //1st one
和
singletonobj.dosomething() //2nd one
是什麼getinstance()
做的區別,一個沒有被在第二種情況下做了什麼?
我碰到過單身模式。 我無法理解getinstance()在單例中究竟做了什麼?
singletonobj.getinstance().dosomething() //1st one
和
singletonobj.dosomething() //2nd one
是什麼getinstance()
做的區別,一個沒有被在第二種情況下做了什麼?
首先,singletonobj
是錯誤/令人困惑的名字。單身人士呼籲類別爲基礎,如:
Log::getInstance().doSomething();
,而不是
Log log = new Log;
log.getInstance().doSomething();
所以這應該回答這個問題,但無論如何,我會詳細:)
Log::doSomething();
將迫使doSomething()
是一種靜態方法,而
Log::getInstance().doSomething();
作爲實例方法,
具有doSomething()
。
爲什麼要用getInstance()
?因爲單身人士根據其定義,應該只有零個或一個實例。通過將單身人員的構造函數設置爲private併發布getInstance()
方法,它允許您控制此類的實例數量。私有構造函數僅僅是爲了避免其他類對這個類進行實例化,這將會破壞這個類作爲單例的目的,因爲你無法控制這個類有多少個實例。
看起來第一個例子是調用常規方法,而第二個例子是調用靜態方法。
Singleton設計模式可確保在任何給定時間僅實例化給定對象的單個實例。第一個示例返回所述實例,然後使用對象的實例調用方法。
第二個例子似乎使用的是不需要對象的實例的靜態方法,實際上無效Singleton設計模式...
我看不出如何使任何東西無效。 –
@ Joschc1107 - 我期望'singletonobj' **是**單個實例。所以'singletonobj。getinstance()'可能會再次返回'singletonobj'。儘管多餘(並且在作者對該模式的理解方面表現出相當大的差距),但它並不符合這種模式。 – ArjunShankar
我的問題是爲什麼把靜態方法放到一個不需要對象實例的單例類中?也許無效是一個字太強,因爲該模式可以用其他方法實現。然而,我很好奇爲什麼人們會想要在同一個對象。除了損害可測試性之外,這會不會導致對象功能的異構混合?我的理解是,單例的目的是提供需要作爲共享資源池實例化一次的方法。如果一個方法不需要這些,它真的屬於那個對象嗎? – JoshC13
那麼,在技術上,singletonobj.getinstance()
是多餘的,因爲這意味着你已經抓住了這個對象。
呼叫通常看起來是這樣的:
SingletonClass::getinstance().dosomething();
或
singletonobj.dosomething()
的情況下,你預取的對象 - 即以前一樣
SingletonClass& singletonobj = SingletonClass::getinstance();
@ m0skit0:當然... –