單例設計模式(餓漢式,懶漢式)

單例設計模式設計模式

正常狀況下一個類能夠建立多個對象安全

1 public static void main(String[] args) { 
2    // 正常狀況下一個類能夠建立多個對象
3     Person p1 = new Person();
4     Person p2 = new Person();
5     Person p3 = new Person();
6  }

 

1.  單例設計模式的做用多線程

單例模式,是一種經常使用的軟件設計模式。經過單例模式能夠保證系統中,應用該模式的這個類只有一個實例。即一個 類只有一個對象實例。ide

 

2.  單例設計模式實現步驟spa

1. 將構造方法私有化,使其不能在類的外部經過new關鍵字實例化該類對象。線程

2. 在該類內部產生一個惟一的實例化對象,而且將其封裝爲private static類型的成員變量。設計

3. 定義一個靜態方法返回這個惟一對象。code

3.  單例設計模式的類型視頻

根據實例化對象的時機單例設計模式又分爲如下兩種:對象

1. 餓漢單例設計模式

2. 懶漢單例設計模式

4.  餓漢單例設計模式

餓漢單例設計模式就是使用類的時候已經將對象建立完畢,無論之後會不會使用到該實例化對象,先建立了再說。很 着急的樣子,故被稱爲「餓漢模式」。

代碼以下:

public class Singleton {

    // 1.將構造方法私有化,使其不能在類的外部經過new關鍵字實例化該類對象。

    private Singleton() {}

    // 2.在該類內部產生一個惟一的實例化對象,而且將其封裝爲private static類型的成員變量。

    private static final Singleton instance = new Singleton();

        // 3.定義一個靜態方法返回這個惟一對象。

    public static Singleton getInstance() {

        return instance; 
   }
 }

 

5.  懶漢單例設計模式

懶漢單例設計模式就是調用getInstance()方法時實例才被建立,先不急着實例化出對象,等要用的時候才例化出對 象。不着急,故稱爲「懶漢模式」。

public static void main(String[] args) {

 // 正常狀況下一個類能夠建立多個對象

    Person p1 = new Person(); 

    Person p2 = new Person();

    Person p3 = new Person();
 }
public class Singleton {

    // 1.將構造方法私有化,使其不能在類的外部經過new關鍵字實例化該類對象。

    private Singleton() {}

   // 2.在該類內部產生一個惟一的實例化對象,而且將其封裝爲private static類型的成員變量。

    private static final Singleton instance = new Singleton();

  // 3.定義一個靜態方法返回這個惟一對象。

    public static Singleton getInstance() {

        return instance;
   }
 }

 

6.  小結

單例模式能夠保證系統中一個類只有一個對象實例。

實現單例模式的步驟:

1. 將構造方法私有化,使其不能在類的外部經過new關鍵字實例化該類對象。

2. 在該類內部產生一個惟一的實例化對象,而且將其封裝爲private static類型的成員變量。

3. 定義一個靜態方法返回這個惟一對象。

7.  示例代碼:

// 定義音樂播放器單例(餓漢式)
class AudioPlayer {
    // 1.將構造方法私有
    private AudioPlayer() {
    }

    // static的成員變量是在類加載的時候就會建立好(早)

    // 2.本類本身建立一個對象,使用靜態的成員變量來保存
    private static AudioPlayer player = new AudioPlayer();

    // 3.提供一個方法,返回這個惟一的對象給別人使用
    public static AudioPlayer getInstance() {
        return player;
    }
}

// 視頻播放器(懶漢式)
class VideoPlayer {
    // 1.將構造方法私有
    private VideoPlayer() {
    }
    // 2.本類本身建立一個對象,使用靜態的成員變量來保存
    private static VideoPlayer player;

    // 3.提供一個方法,返回這個惟一的對象給別人使用
    public static VideoPlayer getInstance() {
        // 若是對象尚未值
        if (player == null) {
            // 就建立一個對象
            player = new VideoPlayer();
        }
        // 懶漢式存在線程安全問題.後面會學多線程,會解決線程安全問題
        return player;
    }
}

public class Demo {
    public static void main(String[] args) {
        AudioPlayer a1 = AudioPlayer.getInstance();
        AudioPlayer a2 = AudioPlayer.getInstance();
        AudioPlayer a3 = AudioPlayer.getInstance();

        System.out.println("a1 = " + a1);
        System.out.println("a2 = " + a2);
        System.out.println("a3 = " + a3);

        // 視頻播放器(懶漢式)
        VideoPlayer vp1 = VideoPlayer.getInstance();
        VideoPlayer vp2 = VideoPlayer.getInstance();
        VideoPlayer vp3 = VideoPlayer.getInstance();
        System.out.println("vp1 = " + vp1);
        System.out.println("vp2 = " + vp2);
        System.out.println("vp3 = " + vp3);

    }
}
相關文章
相關標籤/搜索