單例設計模式設計模式
正常狀況下一個類能夠建立多個對象安全
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); } }