單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例,即一個類只有一個對象實例。
Java中單例模式定義:“一個類有且僅有一個實例,並且自行實例化向整個系統提供。”
package 單例模式;
import java.util.HashMap;
import java.util.Map;
//1.懶漢式單例類,調用getInstance()則實例化,不調用不實例化
public class Singleton {
/**
* Singleton通過將構造方法限定爲private避免了類在外部被實例化,
* 在同一個虛擬機範圍內,Singleton的唯一實例只能通過getInstance()方法訪問。
*/
private Singleton(){}
private static Singleton single=null;
//確保線程安全的寫法
//(1)在getInstance方法上加同步
public static synchronized Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
//(2)雙重檢查鎖定
public static Singleton getInstance2(){
if(single==null){
synchronized(Singleton.class){
if(single==null){
single=new Singleton();
}
}
}
return single;
}
}
//(3)靜態內部類[既實現了線程安全,又避免了同步帶來的性能影響]
class SingletonStatic{
private static class LazyHolder{
private static final SingletonStatic INSTANCE=new SingletonStatic();
}
private SingletonStatic(){}
public static final SingletonStatic getInstance(){
return LazyHolder.INSTANCE;
}
}
/**
* 2.餓漢式單例類,在類初始化時,已經自行實例化
* 餓漢式在類創建的同時就已經創建好一個靜態的對象供系統使用,
* 以後不再改變,所以天生是線程安全的。
*/
class Singleton2{
private Singleton2(){}
private static final Singleton2 single=new Singleton2();
//靜態工廠方法
public static Singleton2 getInstance(){
return single;
}
}
----------------------------------------------
package 單例模式;
/*
* 測試類
*/
public class Test {
public static void main(String[] args) {
// Singleton3 single3=Singleton3.getInstance(null);
// System.out.println(single3.about());
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
}
}
執行測試類,控制檯打印如下:
單例模式.Singleton@1db9742
單例模式.Singleton@1db9742