通俗解釋:單例模式 > 單:唯一 > > 例:實例 > > 單例設計模式,即某個類在整個系統中只能有一個實例對象可被獲取和使用的代碼模式 > > 例如:代表JVM運行環境的Runtime類 ...
單例模式
來源:
https://www.runwsh.com/archives/biitngg1f7s0000
1.什麼事Singleton?
Singleton:在Java中 即指單例設置模式,探視軟體開發最常用的設置模式之一
通俗解釋:單例模式
單:唯一
例:實例
單例設計模式,即某個類在整個系統中只能有一個實例對象可被獲取和使用的代碼模式
例如:代表JVM運行環境的Runtime類
要點:
一是某個類只能有一個實例
構造器私有化
二是他必須自行創建實例
含有一個該類的靜態變數來保存這個唯一的實例
三是它必須自行向整個系統提供這個實例
對外提供獲取該類實例對象的方式
幾種常見形式
餓漢式:
直接創建對象,不存線上程安全問題
直接實例化餓漢式(簡潔直觀)枚舉式 (最簡潔)
靜態代碼塊餓漢式(適合複雜實例化)
懶漢式:延遲創建對象
線程安全(使用於單線程)
線程不安全(使用於多線程)
靜態內部類模式 (適用於多線程)
代碼實現如下
@Data
public class JavaInterviewQuestion {
private String properties;
public static final JavaInterviewQuestion INSTANCE_HUNGRY; // 餓漢式
static {
INSTANCE_HUNGRY=new JavaInterviewQuestion();
Properties proper=new Properties();
try {
// 餓漢式通常會出現一些需要讀取properties文件一些定義的變數,例如sql的jdbc
proper.load(JavaInterviewQuestion.class.getClassLoader().getResourceAsStream("application.properties"));
} catch (IOException e) {
throw new RuntimeException(e);
}
INSTANCE_HUNGRY.setProperties((String) proper.get("cqw"));
}
public static JavaInterviewQuestion INSTANCE_LAZY; // 懶漢式
public JavaInterviewQuestion getInstanceLazyDemo(){
if (INSTANCE_LAZY == null ) {
synchronized (INSTANCE_LAZY) { // 防止初始化實例變數時候,多線程創建多個實例不一致的情況。
if (INSTANCE_LAZY == null){
return INSTANCE_LAZY=new JavaInterviewQuestion();
}
}
}
return INSTANCE_LAZY;
}
}