版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/50750731
1.單例模式的定義
確定某一個類中隻有一個執行個體,而且自行執行個體化并且向整個系統提供一個執行個體。
singleton包下的Singleton是懶漢式單例,Singleton雙檢查單例,Singleton2餓漢式單例
2.單例模式的使用場景:
確定某個類有且隻有一個執行個體。避免産生多個對象消耗過多的資源,或者某種類型的對象隻應該有且既有一個。
例如建立一個對象需要消耗資源過多,如要通路IO和資料庫資源、網絡資源,這事就要考慮使用單例
3單例模式的關鍵點:
(1)構造方法私有化,一般為private
(2).通過一個靜态方法傳回單例對象。
(3)確定單例類對象隻有一個,尤其是在多線程的情況下。
(4)確定單例類對象在反序列化時,不重新建構對象。
4.代碼實作
4.1懶漢式單例
package singleton;
/**
* 懶漢式單列模式
* @author Administrator
* @優點:單例隻有在使用的時候才會初始化化,在一定程度上節約了資源。
* @缺點:第一次加載時需要及時的進行初始化,反應稍微慢,最大的問題是每次調用getInstance
* 都是同步,造成了不必要的開銷,一般不建議使用。
*/
public class Singleton {
private static Singleton instance;
private Singleton(){}
//同步方法
public static synchronized Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
public static void main(String[] args) {
System.out.println();
}
}
4.2雙檢查單例(DCL)模式
package singleton;
/**
*
* @author lidong
* @優點:既能夠在需要的時候初始化單例,又能夠保證線程安全。 并且單例對象初始化後調用getInstance不進行同步鎖。
* @延遲加載方式
*/
public class Singleton1 {
private static Singleton1 instance = null;
private Singleton1() {
}
public static Singleton1 getInstance() {
if (instance == null) {//避免不必要的同步
synchronized (Singleton1.class) {
if (instance == null) {//為null的時候建立執行個體
instance = new Singleton1();
}
}
}
return instance;
}
}
3.餓漢式單例
package singleton;
/**
* 餓漢式單例
* @author lidong
* @預先加載方式
*/
public class Singleton2 {
private static Singleton2 instance = new Singleton2();
private Singleton2() {
}
public static Singleton2 getInstance(){
return instance;
}
}
測試類
package singleton;
public class Test {
public static void main(String[] args) {
//餓漢式
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1.equals(s2));
//懶漢式
Singleton s3 = Singleton.getInstance();
Singleton s4 = Singleton.getInstance();
System.out.println(s3.equals(s4));
//雙枷鎖模式
Singleton1 s5 = Singleton1.getInstance();
Singleton1 s6 = Singleton1.getInstance();
System.out.println(s5.equals(s6));
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println(s5);
System.out.println(s6);
}
}
結果:
true
true
true
singleton.Singleton2@12b6651
singleton.Singleton2@12b6651
singleton.Singleton@4a5ab2
singleton.Singleton@4a5ab2
singleton.Singleton1@1888759
singleton.Singleton1@1888759
下載下傳位址