3 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個贊
在保護(hù)單身人士方面:
它們沒有全局變量那么糟糕,因?yàn)槿肿兞繘]有標(biāo)準(zhǔn)強(qiáng)制的初始化順序,并且您可以輕松地看到由于天真或意外的依賴順序而導(dǎo)致的不確定性錯誤。單身人士(假設(shè)他們在堆上被分配)是在所有全局變量之后創(chuàng)建的,并且在代碼中的一個非??深A(yù)測的位置。
它們對資源惰性/緩存系統(tǒng)非常有用,例如慢速I / O設(shè)備的接口。如果您智能地為慢速設(shè)備構(gòu)建單獨(dú)的接口,并且沒有人調(diào)用它,那么您將不會浪費(fèi)任何時間。如果另一段代碼從多個位置調(diào)用它,您的單例可以同時優(yōu)化兩者的緩存,并避免任何雙重查找。您還可以輕松避免單例控制資源上的任何死鎖條件。
反對單身人士:
在C ++中,單身后沒有很好的自動清理方法。 有一些解決方法和稍微有些方法可以做到這一點(diǎn),但是沒有簡單,通用的方法來確保你的單例的析構(gòu)函數(shù)總是被調(diào)用。對于這個目的而言,這并不是一個非??膳碌挠洃?- 只是將其視為更多的全局變量。但是,如果您的單例分配其他資源(例如鎖定某些文件)并且不釋放它們,則可能會很糟糕。
我自己的意見:
我使用單身人士,但如果有合理的選擇,請避開它們。到目前為止,這對我來說效果很好,而且我發(fā)現(xiàn)它們是可測試的,盡管測試的工作稍微多一些。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個贊
Google有一個針對Java 的Singleton Detector,我認(rèn)為這個工具必須在Google生成的所有代碼上運(yùn)行。刪除單身人士的簡單原因:
因?yàn)樗鼈兛梢允箿y試變得困難并且可以隱藏您的設(shè)計問題
有關(guān)更明確的解釋,請參閱Google的“ 為什么單身人士有爭議 ”。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個贊
單身人士只是一件化裝的全球變數(shù)。
全局變量有它們的用途,就像單身一樣,但是如果你認(rèn)為你正在用單例而不是使用一個令人討厭的全局變量做一些很酷且有用的東西(每個人都知道全局變量是壞的mmkay),你不幸會被誤導(dǎo)。
添加回答
舉報