就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法.
1.餓漢式(靜態常量)
//餓漢式(靜態常量)
public
class
singletontest1
}class
singleton
// 構造器私有化
// 3.對外提供乙個公有的靜態方法,返回例項物件
public
static singleton getinstance()
}
1. 構造器私有化(防止new)
2. 類的內部建立物件
3. 向外暴露乙個靜態的公共方法:getinstance
4. **實現
優點:寫法簡單,在類裝載的時候就完成了例項化,避免了執行緒同步問題
缺點:在類裝載的時候就完成例項化,沒有達到lazy loading的效果。如果從始至終沒有使用這個例項就會造成記憶體浪費
結論:這種單例模式可用,可能會造成記憶體浪費
2.餓漢式模式(靜態**塊)
// 1.構造器私有化,外部不能new
private
singleton()
// 2.本類內部建立物件例項
private
static singleton instance;
static
// 3.對外提供乙個公有的靜態方法,返回例項物件
public
static singleton getinstance()
}
結論:這種單例模式可用,但是可能造成記憶體的浪費
3.懶漢模式(執行緒不安全)
class
singleton
// 提供乙個靜態的公有方法,當使用到該方法時,才去建立instance
// 即懶漢模式
public
static singleton getinstance()
return instance;
}}
優點:
1.起到了lazy loading的效果,但是只能在單執行緒下使用
2.如果在多執行緒下,乙個執行緒進入了if(singleton==null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時會產生多個例項,所以在多執行緒環境下不可使用這種方式
結論:在實際開發中,不要使用這種方式
4.懶漢式(執行緒安全,同步方法)
class
singleton
// 提供乙個靜態的公有方法,當使用到該方法時,才去建立instance
// 即懶漢模式
//加上synchronized確保執行緒同步
public
static
synchronized singleton getinstance()
return instance;
}}
解決了執行緒不安全的問題,但是執行效率太低了。
總結:在實際開發中,不推薦使用這種方式
5.懶漢式(執行緒安全,同步**快)
6.雙重檢查
class
singleton
// 提供乙個靜態的公有方法,加入雙重檢查**,解決執行緒安全問題,同時解決懶載入問題
public
static
synchronized singleton getinstance()
}}return instance;
}}
優缺點說明:
1.double-check 概念是多執行緒開發中常使用到的,如**塊中所示,我們進行了兩次if(singleton==null)檢查,這樣就可以保證執行緒安全了
2.這樣,例項化**只用執行一次
3.執行緒安全:延遲載入:效率也高
7.靜態內部類
class
singleton
//寫下乙個靜態內部類,該類中有乙個靜態屬性singleton
private
static
class
singletoninstance
// 提供乙個靜態的公有方法,直接返回singletoninstance.instance
public
static singleton getinstance()
}
優缺點:
1.這種方式採用了類裝載的機制保證了初始化例項時只有乙個執行緒
2.靜態內部類方式在singleton類被裝載時不會立即例項化,而是在需要時才例項化,呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化
3.類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類初始化時,別的執行緒是無法進入的
4.優點:避免了執行緒不安全,利用了靜態內部類特點實現延遲載入,效率高
8.列舉
public
class
singletontest1
}enum singleton
優缺點:借用jdk1.5新增的列舉來實現單例模式.不僅能避免多執行緒同步問題,而且能防止反序列化重新建立新的物件
結論:推薦使用
單例模式保證了系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能
當想例項化乙個單例類的時候,必須記得使用相應獲取物件的方法,而不是使用new
使用場景:需要頻繁的進行建立和銷毀的物件,建立物件耗時過多或者耗費資源過多,但又經常要用到的物件,工具類物件,頻繁訪問資料庫或者檔案的物件(不如資料來源,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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...