設計模式 單例模式

2021-09-29 18:03:08 字數 4404 閱讀 1771

2、懶漢式

3、靜態內部類

4、註冊式

四、單例模式在實際中的運用

五、單例模式的使用場景

單例設計模式,簡單來說就是通過一定方法保證某個類在整個系統程式中僅存在乙個例項,且各類僅保證乙個區的其物件例項的方法。

1、餓漢式

(1)靜態常量

(2)靜態**塊

2、懶漢式

(1)原版

(2)雙重檢測版

(3)執行緒安全版

3、靜態內部類

4、註冊式

(1)列舉式

(2)容器式

//1.餓漢式(靜態變數)

class

singleton

//2.本類內部建立物件例項

private

final

static singleton instance =

newsingleton()

;//3.提供乙個公有的靜態方法返回例項物件

public

static singleton getinstance()

}

優缺點

(1)優點:該方法基於類裝載機制,避免了多執行緒同步的問題

(2)缺點:沒有達到懶載入的效果,即若從未使用該例項,則造成記憶體的浪費。

//2.餓漢式(靜態變數)

class

singleton

//2.本類內部建立物件例項

private

static singleton instance;

static

//3.提供乙個公有的靜態方法,返回例項物件

public

static singleton getinstance()

}

優缺點

(1)優點:該方法基於類裝載機制,避免了多執行緒同步的問題

(2)缺點:沒有達到懶載入的效果,即若從未使用該例項,則造成記憶體的浪費。

//3.懶漢式(原版)

class

singleton

//提供乙個靜態的公有方法(靜態工廠),只有呼叫方法時才去建立instance

//即懶載入 執行緒不安全

public

static singleton getinstance()

return instance;}}

...public

static

void

main

(string[

] args)

throws exception},

"lazylost");

a.start()

;// a.join();

thread b =

newthread((

)->},

"lazylost2");

b.start()

;}}

優缺點

(1)優點:該方法起到了懶載入的效果,即不會造成記憶體浪費

(2)缺點:多執行緒下,執行緒a進入到if(singleton == null)判斷語句後,執行緒b也通過該判斷語句,則產生了多個例項。

//4.懶漢式(雙重檢測)

class

singleton

//提供乙個靜態的公有方法(靜態工廠),只有呼叫方法時才去建立instance

//即懶載入 同步**塊

public

static singleton getinstance()

}}return instance;

}

優缺點

(1)優點:該方法起到了懶載入的效果,即不會造成記憶體浪費;雙重檢測機制保障一定程度上的執行緒安全;同步**塊而不是同步方法保證了程式效能。

(2)缺點:jvm編譯器的指令重排將有可能導致生成乙個未初始化的例項。

//5.懶漢式(執行緒安全)

class

singleton

//提供乙個靜態的公有方法(靜態工廠),只有呼叫方法時才去建立instance

//即懶載入 同步**塊

public

static singleton getinstance()

}}return instance;

}

優缺點

(1)優點:volatile關鍵字保證jvm的執行順序;懶載入,避免記憶體浪費;雙重檢測和同步塊保證執行緒安全。

(2)缺點:深轉殖會破壞該單例模式,解決方法請參考:深轉殖破壞單例模式

//6.靜態內部類

class

singleton

}private

static

class

singletoninstance

//static保證了單例的共享空間,final保證該方法不被重寫

public

static

final singleton getinstance()

}...

public

static

void

main

(string[

] args)

throws exception

優缺點

(1)優點:利用靜態內部類避免了執行緒不安全,同時實現了懶載入,效率高;在構造方法中的限制導致反射無法破壞該單例

【注】

若未在構造方法中丟擲異常,則反射機制將破解該單例

enum singletonenum

}public

static

void

main

(string[

] args)

throws exception

}

優缺點

(1)優點:利用enum語法糖,jvm會組織反射獲取列舉類的私有構造方法。

(2)缺點:沒有達到懶載入的效果,即若從未使用該例項,則造成記憶體的浪費。

class

singleton

private

static map

ioc =

newconcurrenthashmap

();public

static object getbean

(string classname)

catch

(exception e)

return obj;

}else}}

}

優缺點

(1)優點:便於管理

(2)缺點:非執行緒安全

public

abstract

class

abstractautowirecapablebeanfactory

extends

abstractbeanfactory

implements

autowirecapablebeanfactory..

.//容器式

private factorybean<

?>

getsingletonfactorybeanfortypecheck

(string beanname, rootbeandefinition mbd)if(

issingletoncurrentlyincreation

(beanname)

) object instance = null;

try}

finally

factorybean<

?> fb =

getfactorybean

(beanname, instance);if

(bw != null)

return fb;}}

...}

public

class

runtime..

.}

1)需要頻繁進行建立和銷毀的物件

2)建立常使用的重量級物件(耗時耗資源)

3)工具類物件

4)頻繁訪問資料庫或檔案的物件(session工廠)

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...