相較於其他的設計模式來說,單例模式應該算是最簡單的一種了,因為單例模式的角色只有乙個——那就是它自己!
而單例模式需要幹些什麼呢?
單例模式的類必須自己給自己建立乙個例項,並且其他的類都不能建立,只能自己建立(建構函式私有化)
單例模式的類必須給其他的類提供這個自己建立的例項(getinstance()方法)
最為常見的寫法就是懶漢式單例模式和餓漢式單例模式,但是單例模式的寫法不僅僅只有這兩種,而是很多很多種,雖然是乙個簡單的設計模式,但是實現的方式真的是讓人眼花繚亂!
第一種 懶漢式(非執行緒安全)
public class singleton
//必須將這個物件提供給其他的類使用
public static singleton getinstance()
return singleton;
}}
需要注意的就是這個位置的例項變數是靜態的,一是為了後面的公共靜態方法可以呼叫這個物件,另乙個也是保證只有乙個例項的單例體現。
但是這是乙個執行緒不安全的寫法,在多個執行緒併發訪問的時候,就不能保證之建立乙個例項了!
第二種 懶漢式(執行緒安全)
我們可以直接將方法小小的改良一下:
public class singleton
//必須將這個物件提供給其他的類使用
public static synchronized singleton getinstance()
return singleton;
}}
嘿嘿!在方法上加了乙個synchronized關鍵字修飾,這個時候,這個方法就是乙個同步方法了!
public class singleton
//必須將這個物件提供給其他的類使用
public static singleton getinstance()
}
相比於懶漢式,只是我直接在類載入的時候將例項建立出來,只要其他的類呼叫了我提供的方法,我就直接把例項物件給它們。
第四種 靜態內部類
public class singleton
//私有化建構函式
private singleton(){}
//必須將這個物件提供給其他的類使用
public static singleton getinstance()
}
這也是一種保證單例模式的實現的方式,但是還有一種最最簡單的寫法的。
第五種 列舉
public enum singleton
利用列舉類的特性,只需要一行**就可以解決單例模式!雖然這種方式很是簡單,但是不要小瞧,這個方式還是乙個推薦的方式,因為解決了多執行緒同步的問題和反序列化不一致(也就是防止反序列化的時候重新建立物件)的問題的唉!
但是如果想要更加高大上一些的話,也是有方法的!
第六種 雙重校驗
public class singleton
//必須將這個物件提供給其他的類使用
public static singleton getinstance()
}} return singleton;
}}
volatile關鍵字加上synchronized關鍵字雙管齊下。
單例模式的建立方式有著六種呢,那麼實際情況下到底需要使用哪一種呢?一般自己更喜歡的就是餓漢式和列舉,乙個是比較好理解,乙個是簡單!
靜態內部類也是乙個很不錯的選擇!
但是不能一概而論,還是需要看具體的業務需求。
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...