目錄
- 項目中合理的運用設計模式可以完美的解決很多問題
- 每種模式在現在中都有相應的原理來與之對應
- 每—一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的核心解決方案
- 面向對象的設計模式很多,但大家認爲這23個模式是其它模式的基礎
單例模式
- 滾滾歷史,朝代更迭,永恆定律
- 一個朝代皇帝只有一個
- 軍隊的最高司令官只有一個
- 山不容二虎
- 計算機系統
- 驅動程序
- 打印機後臺處理程序
- 線程池
- 緩存
- 日誌
要點:
- 某個類只能有一個實例
- 必須自行創建實例
- 必須自行向整個系統提供這個實例
實現:
- 只提供私有的構造方法
- 包含一個該類的靜態私有對象
- 提供一個靜態的公有方法用於創建、獲取靜態私有對象
代碼實現方案:
- 餓漢式
package com.imooc.singleton;
//餓漢式:創建對象實例的時候直接初始化 空間換時間
public class SingletonOne {
// 1.創建類中的私有構造
private SingletonOne() {
}
// 2.創建該類型的私有靜態實例
private static SingletonOne instance = new SingletonOne();
// 3.創建公有靜態方法返回靜態實例對象
public static SingletonOne getInstance() {
return instance;
}
}
- 懶漢式
package com.imooc.singleton;
//懶漢式 : 類內實例對象創建時並不直接初始化,直到第一次調用get方法時,才完成初始化操作
//時間換空間
public class SingletonTwo {
// 1.創建類中的私有構造
private SingletonTwo() {
}
// 2.創建靜態的該類實例對象
private static SingletonTwo instance = null;
// 3.創建開放的靜態方法提供實例對象
public static SingletonTwo getInstance() {
if (instance == null)
instance = new SingletonTwo();
return instance;
}
}
餓漢式PK懶漢式
1、餓漢式在類加載時就創建實例,第一次加載速度快
懶漢式第一次使用時才進行實例化,第一次加載速度慢
- 餓漢式:空間換時間
- 懶漢式:時間換空間
2、餓漢式線程安全;懶漢式存在線程風險
解決方案
- 同步鎖
- 靜態內部類
- 雙重校驗鎖
- 枚舉
優點:
- 在內存中只有一個對象、節省內存空間
- 避免頻繁的創建和銷燬對象,提高性能
- 避免對共享資源的多重佔用
缺點:
- 擴展比較困難
- 如果實例化後的對象長期不利用,系統將默認爲垃圾進行回收,造成對象狀態丟失
適用場景:
- 創建對象時佔用資源過多,但同時又需要用到該類對象
- 對系統內資源要求統一讀寫,如讀寫配置信息
- 當多個實例存在可能引起程序邏輯錯誤,如號碼生成器