Java單例設計模式和多例設計模式

單例設計模型

教學視頻連接: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 代碼如上,能夠把懶漢式(須要考慮到線程同步問題)和餓漢式都寫上;

特色:構造方法私有化,類內部提升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!");
    }
}
相關文章
相關標籤/搜索