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


單例設計模型

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

特點:構造方法私有化,類內部提高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!");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM