單例設計模式、模板設計模式
阿新 • • 發佈:2021-10-15
目錄
單例設計模式
什麼是單例設計模式?
單例設計模式,即保證一個類在記憶體中只有一個物件
。
單例設計模式有兩種實現方式,分別是餓漢
單例設計模式和懶漢
單例設計模式
推薦使用餓漢
單例設計模式,因為懶漢單例設計模式會存線上程安全問題,解決方案如下示例。
餓漢單例設計模式
設計步驟:
- 私有化建構函式。
- 宣告本類中的引用變數,並使用該變數指向本類物件。
- 提供一個公共靜態的方法獲取本類的物件。
程式碼示例:
class SingleInstance { // 私有化建構函式 private SingleInstance() { } // 宣告本類中的引用變數,並使用該變數指向本類物件 private static SingleInstance singleInstance = new SingleInstance(); // 提供一個公共靜態的方法獲取本類的物件 public static SingleInstance getInstance() { return singleInstance; } } public class JavaBase { public static void main(String[] args) { SingleInstance s1 = SingleInstance.getInstance(); SingleInstance s2 = SingleInstance.getInstance(); System.out.println(s1==s2); // true } }
懶漢單例設計模式
設計步驟:
- 私有化建構函式。
- 宣告本類的引用變數,但不建立物件。
- 提供公共靜態的方法獲取本類的物件。在獲取之前,先判斷是否已經建立了本類物件,如果已經建立了,那麼直接返回物件即可;若沒建立,則先建立物件再返回物件。
程式碼示例:
class SingleInstance { // 私有化建構函式 private SingleInstance() { } // 宣告本類中的引用變數,並使用該變數指向本類物件 private static SingleInstance singleInstance; // 提供一個公共靜態的方法獲取本類的物件 public static SingleInstance getInstance() { if (singleInstance == null) { synchronized ("鎖") { if (singleInstance == null) { singleInstance = new SingleInstance(); } } } return singleInstance; } } public class JavaBase { public static void main(String[] args) { SingleInstance s1 = SingleInstance.getInstance(); SingleInstance s2 = SingleInstance.getInstance(); System.out.println(s1==s2); // true } }
模板設計模式
模版模式,指某類事情的步驟有些是固定的,有些是會發生變化的,那麼這時候我們可以為這類事情提供一個模版程式碼,從而提高效率。
設計步驟:
- 先寫出解決該類事情其中的一件的解決方案。
- 分析程式碼,把會發生變化的程式碼抽取出來獨立成一個方法。
- 把該方法描述成一個抽象的方法。
- 使用 final 修飾模板方法,防止別人重寫你的模板方法。
程式碼示例:
// 模板方案 abstract class MyRuntime { public final void runTime(){ long startTime = System.currentTimeMillis(); // 記錄當前系統時間 run(); long endTime = System.currentTimeMillis(); // 記錄當前系統時間 System.out.println("執行時間為"+(endTime-startTime)+"毫秒"); } // 分析程式碼,把會發生變化的程式碼抽取出來獨立成一個方法,供使用者使用(重寫) public abstract void run(); } // 重寫模板方案中的抽象方法 public class JavaBase extends MyRuntime { public static void main(String[] args) { JavaBase j = new JavaBase(); j.runTime(); } // 重寫抽象方法 public void run(){ for(int i = 0; i<100; i++){ System.out.println(i); } } }