炒冷飯系列:設計模式 單例模式

炒冷飯系列:設計模式 單例模式

摘要: 原創出處: http://www.cnblogs.com/Alandre/ 泥沙磚瓦漿木匠 但願轉載,保留摘要,謝謝!html

親愛我,孝何難;親惡我,孝方賢。

1、什麼是單例模式

單例模式是一種對象建立型模式,使用單例模式, 能夠保證爲一個類只生成惟一的實例對象。也就是說, 在整個程序空間中,該類只存在一個實例對象。 其實,GoF對單例模式的定義是:保證一個類、 只有一個實例存在,同時提供能對該實例加以訪 問的全局訪問方法。java

2、爲何要使用單例模式呢?

在應用系統開發中,咱們經常有如下需求:設計模式

  • - 在多個線程之間,好比servlet環境,共享同一個資源或者操做同一個對象函數

  • - 在整個程序空間使用全局變量,共享資源性能

  • - 大規模系統中,爲了性能的考慮,須要節省對象的建立時間等等。this

由於Singleton模式能夠保證爲一個類只生成惟一的實例 對象,因此這些狀況,Singleton模式就派上用場了。spa

3、單例模式實現

1.餓漢式。線程

複製代碼

public class Person {    public static final Person person = new Person();    private String name;    
    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    
    //構造函數私有化
    private Person() {
    }    
    //提供一個全局的靜態方法
    public static Person getPerson() {        return person;
    }
}

複製代碼

2.懶漢式。設計

複製代碼

public class Person2 {    private String name;    private static Person2 person;    
    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    
    //構造函數私有化
    private Person2() {
    }    
    //提供一個全局的靜態方法
    public static Person2 getPerson() {        if(person == null) {
            person = new Person2();
        }        return person;
    }
}

複製代碼

3.雙重檢查。code

複製代碼

public class Person3 {    private String name;    private static Person3 person;    
    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    
    //構造函數私有化
    private Person3() {
    }    
    //提供一個全局的靜態方法,使用同步方法
    public static synchronized Person3 getPerson() {        if(person == null) {
            person = new Person3();
        }        return person;
    }
}

複製代碼

複製代碼

public class Person4 {    private String name;    private static Person4 person;    
    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    
    //構造函數私有化
    private Person4() {
    }    
    //提供一個全局的靜態方法
    public static Person4 getPerson() {        if(person == null) {            synchronized (Person4.class) {                if(person == null) {
                    person = new Person4();
                }
            }
        }        return person;
    }
}

複製代碼

MainClass:

複製代碼

public class MainClass {    public static void main(String[] args) {
        Person2 per = Person2.getPerson();
        Person2 per2 = Person2.getPerson();
        per.setName("zhangsan");
        per2.setName("lisi");
        
        System.out.println(per.getName());
        System.out.println(per2.getName());
    }
}

複製代碼

4、感謝知識來源和小結

來自:java設計模式

如以上文章或連接對你有幫助的話,別忘了在文章按鈕或到頁面右下角點擊 「贊一個」 按鈕哦。你也能夠點擊頁面右邊「分享」懸浮按鈕哦,讓更多的人閱讀這篇文章。

親有過 諫使更 怡吾色 柔吾聲 諫不入 悅復諫 號泣隨 撻無怨
相關文章
相關標籤/搜索