問題:應用系統同有時必須保證系統中某個類有且只有乙個例項,並且提供全域性訪問點。
解決方案:建構函式私有,提供全域性可訪問的方法返回例項。
實現方式1:最簡單的單例實現方式。
優點:實現簡單,執行緒安全。
缺點:沒有延遲載入,對效能可能會造成影響,只要載入類或者呼叫同一類的其他方法就會產生例項(實際沒有使用此例項)。
示例**:
public class singleton
public singleton getinstance()
}實現方式2:將建立物件移到全域性訪問方法內部,並判斷成員是否為空,不為空返回物件,反之建立物件並返回。為了保證在多執行緒環境中不會產生多個物件,需對全域性訪問方法加同步鎖。
優點:實現了延遲載入,執行緒安全。
缺點:多執行緒環境下會造成效能明顯下降。
示例**:
public class lazysingleton
public static synchronized lazysingleton getinstance()
}實現方式3:double-check locking,全域性訪問方法內部進行雙重校驗屬性是否為空,並於一重和二重校驗之間新增同步鎖(保證類例項化過程,只進行一次,即保證永遠只會產生乙個例項),成員屬性需要用volatile關鍵字修飾。
優點:實現實際使用例項時才載入,雙重校驗保證只產生乙個例項的同時也保證了多執行緒環境下訪問的效能,執行緒安全。
缺點:示例**:
public class doublechecksingleton
public static doublechecksingleton getinstance()
return instance;}}
實現方式4:通過內部類的方式實現,不載入內部類不會產生例項。
優點:執行緒安全,沒有static屬性,不呼叫全域性訪問方法不會產生例項。
缺點:示例**:
pulbic class innerclasssingleton
private static class lazyholder
public static innerclasssingleton getinstance()
}單例模式序列化:如果單例模式實現了serializable介面,預設情況下,反序列化會產生乙個新的物件,此時並不能保證系統中單例類只產生乙個物件,為了保證物件唯一,我們需要重寫readresolve()。
**示例:
public class singleton implements serializable
public static singleton getinstance()
private object readresolve()
}
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...