天天看點

設計模式——單例模式(Java)設計模式——單例模式(Java)

設計模式——單例模式(Java)

                                        ——Javee

軟體設計模式(Design pattern),又稱設計模式,是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人了解、保證代碼可靠性、程式的重用性。

簡單了解就是:對于特定問題的特定解決方案。

設計模式——單例模式(Java)設計模式——單例模式(Java)

在某些特定的系統中,對于某些特定的類隻需要一個建立的對象,這就是單例模式。

我們身邊有哪些單例模式的執行個體呢?比如說,在學校中,學生和教師可以有多個,但是校長卻隻能有一個;在公司裡,員工可以有多個,但老闆卻隻能有一個。是以,在設計的過程中,校長類和老闆類有且隻能有一個執行個體化對象,這就是生活中最常見的單例模式。

單例模式的特點:

  • 一個類隻有一個對象
  • 類内部聲明一個本類靜态的對象
  • 類隻對外提供一個可以擷取此對象的靜态公共方法
  • 不能在類外建立對象

那麼,單例模式是怎麼實作的呢?在講單例模式的實作之前,我們先回憶一下,通常情況下,我們建立一個對象是怎麼建立的。通常情況下,我們會通過new關鍵字和類對外提供的構造函數或者預設的構造函數來建立一個類的對象。

在單例模式中,為了確定不能在類的外面随意建立對象,會把類的構造函數設為私有private,然後在類的裡面建立一個私有的靜态對象,然後通過public靜态方法把這個對象提供給程式員使用。

單例模式在對象建立的時間上的不同由分為懶漢式和餓漢式:

文字描述起來比較抽象,我們先看代碼:

餓漢式代碼實作:

//餓漢式
package cn.edu.ncu.online;

/**
 * @Author Javee
 * @Date 2019/8/12 20:00
 * @Description
 */
public class Principal {
    //類的私有屬性
    private String name;
    private int age;

    //私有化構造方法
    private Principal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //建立本類的私有靜态對象作為屬性
    private static Principal principal = new Principal("王校長", 30);

    //對外提供一個可以擷取此對象的靜态公共方法
    public static Principal getPrincipal(){
        return principal;
    }
}
           

懶漢式代碼實作:

//懶漢式
package cn.edu.ncu.online;

/**
 * @Author Javee
 * @Date 2019/8/12 20:06
 * @Description
 */
public class Boss {
    //類的私有屬性
    private String name;
    private int age;

    //私有化構造方法
    private Boss(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //建立本類的私有靜态對象作為屬性
    private static Boss boss;

    //對外提供一個可以擷取此對象的靜态公共方法
    public static Boss getBoss(){
        if(boss == null) {
            boss = new Boss("王校長", 30);
        }
        return boss;
    }
}
           

我們仔細對比一下這兩段代碼,唯一的差別就是初始化對象的時間不同。故名思意,比如我是一個乞讨者,聲明對象就是你給了我錢,而初始化對象就是我用錢買了饅頭。餓漢式就是,我太餓了,你給了我錢我立馬就買了饅頭來吃,是以在聲明對象時就初始化了對象。懶漢式就是,我比較懶,你給了我錢,但我現在懶得買,等到餓的受不了的時候再去買饅頭,是以剛開始隻是聲明對象,在用這個對象的時候再去初始化它。

雖然懶漢式和餓漢式初始化有所差別,但是在使用方面沒有差別。但是在第一次擷取對象之前,懶漢式因為還沒有初始化對象,是以比餓漢式節省空間。多線程操作時,懶漢式存線上程安全問題,餓漢式沒有線程安全問題。