單例模式零如,是一種常用的軟件設(shè)計模式苛聘。
在它的核心結(jié)構(gòu)中只包含一個被稱為單例的特殊類。
通過單例模式可以保證系統(tǒng)中耳奕,應(yīng)用該模式的類一個類只有一個實例。即一個類只有一個對象實例
弊端:
反對使用單利模式的原因:
1瞻佛、如果不想使用單例模式或全局變量梅忌,最簡單的對象引用方式就是:將對象當成“方法參數(shù)”,一路傳遞到最后需要使用該對象的方法中僧鲁。
如果設(shè)計不當虐呻,那么方法的參數(shù)數(shù)量就會容易失控而變多,造成難以維護的情況寞秃。
2斟叼、而程序員一旦發(fā)現(xiàn)這個“馬上獲取”的好處就會出現(xiàn)問題 “單例癖”
單例模式違反了“開閉原則”:通過Instance方法獲取對象是實現(xiàn)類而不是接口類,該方法返回的對象包含了實現(xiàn)細節(jié)的實體類春寿。
當需求變更或增加時朗涩,無法將其替換其他類。只能更改原有的實現(xiàn)類的邏輯绑改。
3谢床、讓單例模式返回接口類——即父類為單例模式類型,并讓子類繼承實現(xiàn)厘线,并不是沒有辦法
子類向父類注冊實體對象萤悴,讓父類的Instance方法返回對象時。按條件查表返回對應(yīng)的子類對象皆的。
每個子類都實現(xiàn)單例模式覆履,再由父類的Instance去獲取這些子類
4、會引起白馬非馬的問題
解決方案:
少用單例如何方便地引用到單一對象:
1费薄、單例模式的兩個重要特性:唯一的對象和容易獲取對象硝全。
2、如何減少單例的使用:分析需求楞抡,如果只需要其中一個伟众,那么可以用以下幾種方式來設(shè)計系統(tǒng)
讓類具有計數(shù)功能來限制對象數(shù)量
在類中加上計數(shù)器-靜態(tài)成員屬性,每當構(gòu)造被調(diào)用時就讓計數(shù)器增加1召廷,然后判斷有沒有超過限制的數(shù)量凳厢。可以加輸出方便調(diào)試
設(shè)置成為類的引用竞慢,讓對象可以被取用 ;(構(gòu)造時傳入)
某個類的功能被大量使用時先紫,可以將這個類對象設(shè)置為其他類中的成員,方便直接引用這些類
而這種 依賴性注入 筹煮,可以讓引用對象不必通過參數(shù)傳遞的方式遮精,就能被類的其他方法引用。
3、使用類的靜態(tài)方法
設(shè)置成為類的引用:
1本冲、按照設(shè)置方式分為:分別設(shè)置和指定類靜態(tài)成員
2准脂、分別設(shè)置:在各個系統(tǒng)初始化的時候?qū)㈩悓ο笾付ńo每一個游戲系統(tǒng),并讓游戲系統(tǒng)設(shè)置為類成員檬洞。那么后續(xù)使用的時候就可以直接調(diào)用這個類成員來調(diào)用類的方法
3狸膏、指定類靜態(tài)成員
A類邏輯中需要使用B類的方法,并且A類在產(chǎn)生其對象時其具有下列幾種情況:
產(chǎn)生對象的位置不確定添怔;
有多個地方可以產(chǎn)生對象湾戳;
生成的位置無法引用到;
有眾多子類澎灸。
當滿足上述情況之一,可以直接將B類對象設(shè)置為A類中的“靜態(tài)成員屬性”遮晚,讓該類對象都可以直接使用