1. 程式人生 > >淺談Java設計模式——單例模式

淺談Java設計模式——單例模式

一、概述

        單例模式主要是為了避免因為建立了多個例項造成資源的浪費,且多個例項由於多次呼叫容易導致結果出現錯誤,而使用單例模式能夠保證整個應用中有且只有一個例項。

二、定義

定義:只需要三步就可以保證物件的唯一性

  • (1) 不允許其他程式用new物件
  • (2) 在該類中建立物件
  • (3) 對外提供一個可以讓其他程式獲取該物件的方法

對比定義:

  • (1) 私有化該類的建構函式
  • (2) 通過new在本類中建立一個本類物件
  • (3) 定義一個公有的方法,將在該類中所建立的物件返回

三、類圖

                                

四、程式碼實現 

        單例模式中,由於建立類的時間不用又分為兩種單例類懶漢式單例類

餓漢式單例

懶漢式單例類:例項物件在第一次被呼叫時,才會將自己例項化,所以被形象的稱之為懶漢式單例類。

/**
 * 單例模式——懶漢式單例類
 */
public class SingleCaseLazy {
    // 存放例項物件
    private static SingleCaseLazy singleCaseLazy;

    // 私有化構造器,阻止被其他類new出來
    private SingleCaseLazy() { }

    // 外界通過此類獲取本類物件
    public static SingleCaseLazy getInstance() {

        // 先判斷例項是否存在,不存在再加鎖處理
        if (singleCaseLazy == null) {
            // 在同一個時刻加了鎖的那部分只有一個執行緒可以進入
            synchronized (SingleCaseLazy.class) {
                // 防止多執行緒情況下,執行緒都到達鎖上等待時,等待完成進入再次建立例項
                if (singleCaseLazy == null) {
                    // 建立例項
                    singleCaseLazy = new SingleCaseLazy();
                }
            }
        }

        // 返回例項
        return singleCaseLazy;
    }

    public void description() {
        System.out.println("SingleCaseLazy Class successful......");
    }
}

餓漢式單例類:靜態初始化方式在自己被載入時將自己例項化,所以被形象的稱之為餓漢式單例。

/**
 * 單例模式——餓漢式單例類
 */
public class SingleCaseHungry {
    // 存放例項物件
    private static SingleCaseHungry singleCaseHungry = new SingleCaseHungry();

    // 私有化構造器
    private SingleCaseHungry() { }

    // 外界通過此類獲取本類物件
    public static SingleCaseHungry getInstance() {
        // 返回例項
        return singleCaseHungry;
    }

    public void description() {
        System.out.println("SingleCaseHungry Class successful......");
    }
}

測試程式碼:

/**
 * 測試程式碼
 */
public class SingleCaseDemo {
    public static void main(String[] args) {
        // 懶漢式單例類
        SingleCaseLazy singleCaseLazy = SingleCaseLazy.getInstance();
        singleCaseLazy.description();

        // 餓漢式單例類
        SingleCaseHungry singleCaseHungry = SingleCaseHungry.getInstance();
        singleCaseHungry.description();
    }
}