1. 程式人生 > >Java的單例模式——有C++基礎的Java入門(五)

Java的單例模式——有C++基礎的Java入門(五)

目錄

什麼是單例模式(Singleton)?

一、 懶漢模式

1、 例項

2、 原理

二、 餓漢模式

1、 例項


什麼是單例模式(Singleton)?

設計模式:Java中,一共有23種設計模式,說白了就是比較牛的程式碼設計思想。單例模式裡面非常簡單的一種。

比如說windows的桌面回收站,只能開啟這麼一個回收站的介面,不能開啟第二個介面。具體細節,我會拿出例項程式碼來詳細闡述。

一、 懶漢模式

1、 例項

public class Singleton {

    //在單例類的內部建立一個自己本身的物件
    private static Singleton s=new Singleton();

    //獲得單例的物件
    public static Singleton getSingleton(){
        return s;
    }
    //構造器的私有化
    private Singleton(){

    }
}

class TestDemo{
    public static void main(String[] args) {
        Singleton s1= Singleton.getSingleton();
        System.out.println(s1);
        
        //測試是否引用的是否是同一個物件
        Singleton s2= Singleton.getSingleton();
        System.out.println(s2);

        Singleton s3= Singleton.getSingleton();
        System.out.println(s3);
    }
}

執行結果

總結:說明引用的都是同一個物件,這就是單例模式。下面分析一下原理。

2、 原理

其實這就是一個靜態屬性的生命週期。

 因為構造器(就是建構函式)是空的,所以在堆中new Singleton只有一個地址,資料共享區的Singleton定義的s也有地址,指向堆中的0x999;當呼叫getSingleton()這個方法的時候,getSingleton就進棧產生一個地址,在getSingleton()執行完之後,返回了一個物件s(請看上方程式碼return s; ),s正好又是new Singleton()地址(請看上方程式碼private static Singleton s=new Singleton();)。所以在TestDemo中的s1的地址就會指向new Singleton的地址,在下面繼續s2、s3的時候,都會拿到一個相同的地址。

二、 餓漢模式

1、 例項

public class Singleton {

    //在單例類的內部建立一個自己本身的物件
    private static Singleton s;
    public static Singleton getSingleton(){
        if (s == null){
            s=new Singleton();
            return s;
        }
        return s;
    }
    //構造器的私有化
    private Singleton(){

    }
}

class TestDemo{
    public static void main(String[] args) {
        Singleton s1= Singleton.getSingleton();
        System.out.println(s1);

    }
}

對比一下“懶漢模式”突然發現,“餓漢模式”巧妙的節省了資源。