1. 程式人生 > 其它 >單例設計模式、模板設計模式

單例設計模式、模板設計模式

目錄

單例設計模式

什麼是單例設計模式?

單例設計模式,即保證一個類在記憶體中只有一個物件

單例設計模式有兩種實現方式,分別是餓漢單例設計模式和懶漢單例設計模式

推薦使用餓漢單例設計模式,因為懶漢單例設計模式會存線上程安全問題,解決方案如下示例。

餓漢單例設計模式

設計步驟:

  1. 私有化建構函式。
  2. 宣告本類中的引用變數,並使用該變數指向本類物件。
  3. 提供一個公共靜態的方法獲取本類的物件。

程式碼示例:

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
    }
}

懶漢單例設計模式

設計步驟:

  1. 私有化建構函式。
  2. 宣告本類的引用變數,但不建立物件。
  3. 提供公共靜態的方法獲取本類的物件。在獲取之前,先判斷是否已經建立了本類物件,如果已經建立了,那麼直接返回物件即可;若沒建立,則先建立物件再返回物件。

程式碼示例:

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
    }
}

模板設計模式

模版模式,指某類事情的步驟有些是固定的,有些是會發生變化的,那麼這時候我們可以為這類事情提供一個模版程式碼,從而提高效率。

設計步驟:

  1. 先寫出解決該類事情其中的一件的解決方案。
  2. 分析程式碼,把會發生變化的程式碼抽取出來獨立成一個方法。
  3. 把該方法描述成一個抽象的方法。
  4. 使用 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);
        }
    }

}