單例作為一種可供全局使用的唯一對(duì)象,而被普遍使用。但是能夠這么做不代表就應(yīng)該這么用。
單例在帶來(lái)便利的同時(shí)也應(yīng)該受到約束,如果一個(gè)單例遍布每個(gè)模塊各處,這本身就是錯(cuò)誤的使用方式,其缺點(diǎn)如下:
- 如果需要修改API,則涉及范圍過(guò)大
- 各功能模塊會(huì)直接將依賴關(guān)系與其綁定
- 在使用時(shí)可能會(huì)調(diào)用不正確的API、錯(cuò)誤的調(diào)用順序又或者更改其內(nèi)部狀態(tài)
所以在使用單例時(shí),從API設(shè)計(jì)上來(lái)講,允許同一API可以反復(fù)被調(diào)用、降低時(shí)序耦合的幾率、封裝其不必要的接口,僅在各模塊啟動(dòng)入口對(duì)其引用。
注:還有一種與單例模式非常相似的模式叫做 環(huán)境上下文(Ambient Context),它所含有的缺點(diǎn)與單例一樣。它在使用時(shí)與單例的區(qū)別是:單例模式是始終保持唯一的對(duì)象,環(huán)境上下文是允許對(duì)象變更的。