什么是Singleton?
單例設計模式,即某個類在整個系統中只能有一個實體物件可被獲取和使用的代碼模式,
例如:代表JVM運行環境的Runtime類,
要點
- 一是某個類只能有一個實體
構造器私有化 - 二是它必須自行創建這個實體
含有一個該類的靜態變數來保存這個唯一的實體 - 三是它必須自行向整個系統提供這個實體
對外提供獲取該實體物件的方式
(1)餓漢式:直接創建物件,不存在執行緒安全問題
- 直接實體化餓漢式
- 列舉式
- 靜態代碼塊餓漢式
(2)懶漢式:延遲創建物件
- 執行緒不安全(只適用于單執行緒)
- 執行緒安全
- 靜態內部類形式
/**
* 餓漢式:
* 直接創建實體物件,不管你是否需要這個物件
*
* (1)構造器私有化
* (2)自行創建,并且用靜態變數保存
* (3)向外提供這個實體
* (4)強調這是一個單例,我們可以用final修改
*/
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1();
private Singleton1(){}
}
/**
* 列舉型別:表示該型別的物件是有限的幾個
* 我們可以限定為一個,就成了單例
*/
public enum Singleton2 {
INSTANCE
}
/**
* 靜態代碼塊
* 適合復雜實體化
*/
public class Singleton3 {
public static final Singleton3 INSTANCE;
static {
INSTANCE = new Singleton3();
}
private Singleton3(){}
}
/**
* 懶漢式
* 延遲創建這個實體物件
*(1)構造器私有化
*(2)用一個靜態變數保存這個唯一的實體
*(3)提供一個靜態方法,獲取這個實體物件
*/
public class Singleton4 {
private static Singleton4 instance;
private Singleton4(){
}
public static Singleton4 getInstance(){
if(instance == null){
instance = new Singleton4();
}
return instance;
}
}
/**
* 懶漢式(執行緒安全)
* 延遲創建這個實體物件
*(1)構造器私有化
*(2)用一個靜態變數保存這個唯一的實體
*(3)提供一個靜態方法,獲取這個實體物件
*/
public class Singleton5 {
private static Singleton5 instance;
private Singleton5(){
}
public static Singleton5 getInstance(){
if(instance == null){
synchronized (Singleton5.class){
if(instance == null){
instance = new Singleton5();
}
}
}
return instance;
}
}
/**
* 在內部類被加載和初始化時,才創建INSTANCE實體物件
* 靜態內部類不會自動隨著外部類的加載和初始化而初始化,它是要單獨去加載和初始化的,
*/
public class Singleton6 {
private static Singleton6 instance;
private Singleton6(){
}
private static class Inner{
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6 getInstance(){
return Inner.INSTANCE;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/255466.html
標籤:Java
下一篇:final關鍵字在PHP中的使用
