該模式是與具體的項(xiàng)目業(yè)務(wù)無關(guān)的設(shè)計(jì)模式
單例模式,是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例。即一個(gè)類只有一個(gè)對象實(shí)例
模式如圖:

單例模式
單列模式有很多種,下面來一種一種的介紹。
1.懶漢式,也是常用的形式。
public class SingletonClass{
private static SingletonClass instance=null;
//線程安全,但是延遲加載,去掉synchronized關(guān)鍵字,就線程不安全了
public static synchronized SingletonClass getInstance(){
if(instance==null){
instance=new SingletonClass();
}
return instance;
}
//構(gòu)造函數(shù)是私有的,自己才可以用
private SingletonClass(){
}
}
2.:餓漢式,不延遲加載,線程安全
public class Singleton{
//在自己內(nèi)部定義自己的一個(gè)實(shí)例,只供內(nèi)部調(diào)用
private static final Singleton instance = new Singleton();
private Singleton(){
//do something
}
//這里提供了一個(gè)供外部訪問本class的靜態(tài)方法,可以直接訪問
public static Singleton getInstance(){
return instance;
}
}
3.雙重校驗(yàn)鎖(DCL),延遲加載,線程安全
public class Singleton{
private static volatile Singleton instance=null;
private Singleton(){
//do something
}
//這個(gè)模式將同步內(nèi)容下方到if內(nèi)部,提高了執(zhí)行的效率,不必每次獲取對象時(shí)都進(jìn)行同步,只有第一次才同步,創(chuàng)建了以后就沒必要了。
//處理高并發(fā)的懶漢式
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
4.靜態(tài)內(nèi)部類,延遲加載,線程安全
public class Singleton {
/**
* 類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實(shí)例與外部類的實(shí)例
* 沒有綁定關(guān)系,而且只有被調(diào)用到才會裝載,從而實(shí)現(xiàn)了延遲加載
*/
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}