1. 程式人生 > >第3條:用私有構造器或者列舉型別強化Singleton屬性

第3條:用私有構造器或者列舉型別強化Singleton屬性

Singleton指僅僅被例項化一次的類。

例如:檔案系統,資料庫連線,視窗管理器等

在Java 1.5之前,實現Singleton有兩種方法,這兩種方法都要把構造器保持為私有的,下面直接貼例項程式碼,應該都能看懂:

第一種:
需要獲取的公有靜態成員(需要實現Singleton的物件)是個final域

public class DataBaseSource{
    public static final DataBaseSource INSTANCE = New DataBaseSource();

    private DataBaseSource(){...}

    //省略其餘程式碼
}

第二種:
需要獲取的公有的成員(需要實現Singleton的物件)是個靜態工廠方法

public class UtillA{
    public static final DataBaseSource INSTANCE = New DataBaseSource();

    private DataBaseSource(){...}

    public static DataBaseSource getInstance(){return INSTANCE;}

    //省略其餘程式碼
}

從Java 1.5發行版本開始。採用單元素的列舉型別已經成為實現Singleton的最佳方法

為什麼?
因為這樣的寫法更加簡潔,無償提供了序列化機制,絕對防止多次例項化,即使在面對複雜的序列化或者反射攻擊的時候也可以。

只需要編寫一個包含單個元素的列舉型別:

public enum DataBaseSource{
    INSTANCE;

    private DataBaseSource(){...}

    public void method1(){
        //省略方法實現
    }
    public void method2(){
        //省略方法實現
    }
}
//如何呼叫?
public class Test {
    public
static void main(String[] args) { DataBaseSource.INSTANCE.method1(); DataBaseSource.INSTANCE.method2(); } }