單例設計模型
教學視頻鏈接:https://edu.aliyun.com/course/1011
1,private不可以在類外部訪問,但可以在內部訪問
2,此時Singleton類內部的instance屬於一個普通屬性,而普通屬性是在有實例化對象產生之后才會被調用的,那么這個時候外部無法產生實例化對象,所以這個屬性就不能訪問到了,那么就必須考慮如何在沒有實力化對象的時候可以獲取此屬性,那么只有static屬性可以訪問。
Singleton.java
1 class Singleton { 2 static Singleton instance=new Singleton(); 3 private Singleton(){} 4 public void print(){ 5 System.out.println("這是一個單例"); 6 } 7 }
Main.java
1 public class Main { 2 public static void main(String[] args) { 3 Singleton instance=null; 4 instance=Singleton.instance; 5 instance.print(); 6 System.out.println("Hello World!"); 7 } 8 }
3,類中的屬性應該封裝后使用,所以理論上此時的instance需要封裝起來,那么就需要一個static方法獲取
1 class Singleton { 2 static Singleton instance=new Singleton(); 3 private Singleton(){} 4 public static Singleton getInstance(){ 5 return instance; 6 } 7 public void print(){ 8 System.out.println("這是一個單例"); 9 } 10 }
1 public class Main { 2 3 public static void main(String[] args) { 4 Singleton instance=null; 5 instance=Singleton.getInstance(); 6 instance.print(); 7 System.out.println("Hello World!"); 8 } 9 }
4,整個代碼強調的是只有一個實例化對象,這個時候雖然提供有static的實例化對象,但是這個對象依然可以被重新實例化,所以需要保證此時Singleton類內部的instance無法再次實例化定義,那么應該使用final定義。
1 class Singleton { 2 private static final Singleton INSTANCE=new Singleton(); 3 private Singleton(){} 4 public static Singleton getInstance(){ 5 return INSTANCE; 6 } 7 public void print(){ 8 System.out.println("這是一個單例"); 9 } 10 }
1 public class Main { 2 3 public static void main(String[] args) { 4 Singleton instance=null; 5 instance=Singleton.getInstance(); 6 instance.print(); 7 System.out.println("Hello World!"); 8 } 9 }
在很多情況下有些類是不需要重復產生對象的,例如:如果一個程序啟動,那么現在肯定需要有一個類負責保存有一些程序加載的數據信息。
對於單例設計模型也分為兩種:懶漢式和餓漢式。在之前所定義的都屬於餓漢式。在系統加載類的時候就會自動提供Singleton類的實例化對象,而還有一種懶漢式,在第一次使用的時候進行實例化對象處理。
范例:將我們的單例修改成懶漢式
1 class Singleton { 2 private static Singleton instance; 3 private Singleton(){} 4 public static Singleton getInstance(){ 5 if (instance==null){ 6 instance=new Singleton(); 7 } 8 return instance; 9 } 10 public void print(){ 11 System.out.println("這是一個單例"); 12 } 13 }
5,面試題:請編寫一個Singleton程序,並說明其主要特點?
l 代碼如上,可以把懶漢式(需要考慮到線程同步問題)和餓漢式都寫上;
l 特點:構造方法私有化,類內部提高getInstance方法獲取實例化對象,不管外部如何操作都只有一個實例化對象提供;
多例設計模式
本質上,多例設計模式也是一種單例設計模式【我的個人理解】,因為也是只有對應的單個實例化對象,每次調用的實例化都是同一個對象,不重復造輪子!
與單例設計相對應的還有一個稱為多例設計,單例設計指的是只保留有一個實例化對象,例如:如果現在要定義一個描述性別的類,那么這個對象只有兩個:男、女。或者描述顏色基色的類,可以使用:R G B 三原色。這種情況下就可以利用多例設計來解決:
范例:多例設計模式
1 class Color { 2 private static final Color RED = new Color("紅色"); 3 private static final Color GREEN = new Color("綠色"); 4 private static final Color BLUE = new Color("藍色"); 5 private String title; 6 private Color(String title){//構造方法私有化 7 this.title=title; 8 } 9 public static Color getInstance(String color){ 10 switch (color){ 11 case "red":return RED; 12 case "green":return GREEN; 13 case "blue":return BLUE; 14 default:return null; 15 } 16 } 17 public String toString(){ 18 return this.title; 19 } 20 }
public class Main { public static void main(String[] args) { Color color=Color.getInstance("green"); System.out.println(color); System.out.println("Hello World!"); } }