1. 程式人生 > 其它 >JAVA學習設計模式——單例模式(Singleton Pattern)

JAVA學習設計模式——單例模式(Singleton Pattern)

技術標籤:設計模式學習JAVA設計模式學習記錄java設計模式

目錄

單例模式簡介

單例模式,顧名思義就是單一的例項的模式。換句話說就是一個類只能有最多一個物件,並且該類需要在類中自己建立該物件例項。同時類中必須有一個外界獲取該物件的方法。

單例模式實現

首先需要能夠一個類只有一個物件,外界不能建立新的物件,所以需要將該類的建構函式設為私有,並且在類中建立該類的物件。同時需要用一個方法給外界提供這個物件

首先介紹一種實現單例模式的方法

餓漢式和懶漢式

先放程式碼吧,餓漢式程式碼如下

class SingleObject0
{ //這是餓漢式 private SingleObject0() {} private String name; private static SingleObject0 instance = new SingleObject0(); public static SingleObject0 getInstance() { return instance; } public void setName(String name1) { name = name1; } public String getName
() { return name; } }

懶漢式程式碼如下

class SingleObject1{
    //這個是懶漢式
    private SingleObject1() {}
    private String name;
    private static SingleObject1 instance;
    public static synchronized  SingleObject1 getInstance() {
        if(instance == null)
        {
            instance = new
SingleObject1(); } return instance; } public void setName(String name1) { name = name1; } public String getName() { return name; } }

現在介紹一下這兩種的區別和優缺點:
區別我們很容易看出來,餓漢式是在宣告這個物件的時候就直接例項化了而懶漢式是在呼叫getInstance方法時才會進行例項化,並且懶漢式中為了實現單一例項,這裡使用了一個if語句進行判斷
再來介紹這兩種的優缺點。
首先是餓漢式中,在宣告的時候就直接例項化,好處是能夠實現執行緒安全,但是缺點也很明顯,那就是會浪費記憶體。
懶漢式中,雖然在不用例項時不會進行例項化,沒有記憶體浪費。但是可以看到在getInstance方法中例項化會有執行緒安全的問題,所以需要加上鎖,而加上鎖之後每次呼叫getInstance時會因為鎖影響效率。
所以下面會介紹一種方法能同時保證效能和執行緒安全

雙檢鎖

還是先放程式碼

class DoubleCheck{
    //雙重校驗鎖
    private DoubleCheck(){};
    private static DoubleCheck instance;
    public static DoubleCheck getInstance(){
        if(instance == null){
            synchronized (instance){
                if (instance == null){
                    instance = new DoubleCheck();
                }
            }
        }
        return instance;
    }
}

可以看到在使用鎖的時候,先使用了一個if語句判斷,這樣就能很好的控制鎖的使用提高效率,同時實現執行緒安全。
另外還有一個叫列舉式

列舉式

程式碼如下

enum Singleton{
    INSTANCE;
    public void anyMethod(){
    }
}

這個方法並不是傳統的類的使用,但是我看菜鳥教程上描述這個方法時候說這個事實現單例模式的最佳方法。大家見仁見智,主要還是具體情況使用最適合的方法吧。

執行程式碼

最後給大家看一下執行的程式碼和執行情況,使用的是餓漢式的。
程式碼如下

public class User {
    public static void main(String[] args) {
        SingleObject0 object1 = SingleObject0.getInstance();
        SingleObject0 object2 = SingleObject0.getInstance();
        object1.setName("遊蘆");
        System.out.println("object1:"+object1.getName());
        System.out.println("object2:"+object2.getName());
    }
}

執行如圖所示
在這裡插入圖片描述
可以看出來object1和object2用的是同一個例項


本文參考文章有:

https://www.runoob.com/design-pattern/singleton-pattern.html
https://blog.csdn.net/absolute_chen/article/details/93380566

完整的專案程式碼已經上傳GitHub,大家有需要可以前去下載
https://github.com/jianqiang-Zhang/SingletonPattern