1. 程式人生 > 實用技巧 >Java基礎之:單例模式

Java基礎之:單例模式

Java基礎之:單例模式

設計模式

設計模式是在大量的實踐中總結和理論化之後優選的程式碼結構、程式設計風格、以及解決問題的思考方式 。設計模式就像是經典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。

單例模式

對於一個類而言,外部只能獲取其一個例項。

實現步驟:

1) 構造器私有化

2) 類的內部建立物件

3) 向外暴露一個靜態的公共方法。getDog,getCat。

簡單案例

package codeBlock;
​
public class Singleton {
​
    public static void main(String[] args) {
        
        Dog dog1 = Dog.getDog();
        Dog dog2 = Dog.getDog();
        System.out.println(dog1.getName()); //旺財
        System.out.println(dog2.getName()); //旺財
        System.out.println(dog2 == dog1);   //true
        
        
        Cat cat1 = Cat.getCat();
        Cat cat2 = Cat.getCat();
        System.out.println(cat1.getName());  //布偶
        System.out.println(cat2.getName());  //布偶
        System.out.println(cat2 == cat1);  //true
    }
​
}
​
//餓漢模式:宣告一個物件,將其初始化並作為一個靜態屬性,在外部需要此類物件時,直接返回此物件。
class Dog{
    private String name;
    private static Dog dog = new Dog("旺財");  //靜態屬性,所以只有一個dog
    
    private Dog(String name) {
        this.name = name;
    }
    
    public static Dog getDog() {
        return dog;
    }
    
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
    
}
​
//懶漢模式:宣告一個物件,並作為一個靜態屬性,在外部需要此類物件時將其初始化,再返回此物件。
class Cat{
    private String name;
    private static Cat cat ;    //靜態屬性,所以只有一個cat
    
    private Cat(String name) {
        this.name = name;
    }
    
    public static Cat getCat() {
        if(cat == null) {
            cat = new Cat("布偶");
        }
        return cat;
    }
    
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
    
}

餓漢模式與懶漢模式

  1. 二者最不同的點在於物件宣告的時機。餓漢模式是在類載入時,就宣告並初始化一個物件作為靜態變數,而懶漢模式是在類載入時宣告一個靜態屬性,在外部需要例項時再建立物件。

  2. 餓漢式不存線上程安全問題,懶漢式存線上程安全問題。

  3. 餓漢式存在浪費資源的可能。因為如果程式設計師一個物件例項都沒有使用,那麼餓漢式建立的物件就浪費了,懶漢式是使用時才建立,就不存在這個問題。

  4. java.lang.Runtime就是經典的單例模式。