教學視頻連接:https://edu.aliyun.com/course/1011java
1,private不能夠在類外部訪問,但能夠在內部訪問面試
2,此時Singleton類內部的instance屬於一個普通屬性,而普通屬性是在有實例化對象產生以後纔會被調用的,那麼這個時候外部沒法產生實例化對象,因此這個屬性就不能訪問到了,那麼就必須考慮如何在沒有實力化對象的時候能夠獲取此屬性,那麼只有static屬性能夠訪問。設計模式
Singleton.javathis
1 class Singleton { 2 static Singleton instance=new Singleton(); 3 private Singleton(){} 4 public void print(){ 5 System.out.println("這是一個單例"); 6 } 7 }
Main.javaspa
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 }
在不少狀況下有些類是不須要重複產生對象的,例如:若是一個程序啓動,那麼如今確定須要有一個類負責保存有一些程序加載的數據信息。code
對於單例設計模型也分爲兩種:懶漢式和餓漢式。在以前所定義的都屬於餓漢式。在系統加載類的時候就會自動提供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!"); } }