單例模式--兩種方式

package com.factory;
/*
 * 第一種方式建立單例
 */
class OneSingleton{
    private static int number =0;       //私有屬性
    private static OneSingleton instance = new OneSingleton();  //OneSingleton的惟一實例
    private OneSingleton(){}
    public static OneSingleton getInstance(){
        return instance;
    }
    public synchronized int getNumber(){    //synchronized關鍵字表示方法是線程同步
        return number;                      //任一時刻最多隻能有一個線程進入該方法
    }
    public synchronized int nextNumber(){
        return number++;
    }
}
/*
 * 第二種建立單例方法
 */
class TwoSingleton{
    private static int number =0;
    private static TwoSingleton instance = null;
    private TwoSingleton(){}
    public static synchronized TwoSingleton getInstance(){
        if(instance == null){
            instance = new TwoSingleton();
        }
        return instance;
    }
    public synchronized int getNumber(){
        return number;
    }
    public synchronized int nextNumber(){
        return number++;
    }
}
/**
 * @function 單例模式
 * @author JarCode
 * 技術要點:
 * 單例模式有兩種實現方式:
 * >>一種是將類的 構造方法私有化,用一個私有的類變量instance保存類的實例,
 *在加載類時,建立類的實例,改方法直接返回instance.
 * >>另外一種是將類的 構造方法私有化,用一個私有的類變量instance保存類的實例,
 *在加載類時,將null賦給instance,再提供一個公有的靜態方法getInstance
 * ,用於獲取類的惟一實例,該方法首先判斷instance是否爲null,
 *若是爲null,則建立實例對象,不然返回instance。
 *
 * 兩種方式的區別:
 * >>前者被加載時,類的惟一實例被建立,後者在第一次調用getInstance()方法時,類的惟一實例被建立,但須要在getInstance()方法中使用synchronized
 * 關鍵字,保證某一時刻只有一個線程調用此方法。
 *
 */
public class TestSingleton {
    public static void main(String[] args) {
        OneSingleton one1 = OneSingleton.getInstance();
        OneSingleton one2 = OneSingleton.getInstance();
        System.out.println("用onsingleton實現單例模式");
        System.out.println("調用nextnumber()方法以前:");
        System.out.println("one1.number="+one1.getNumber());
        System.out.println("one2.number="+one2.getNumber());
        one1.nextNumber();
        System.out.println("調用nextnumber()方法後:");
        System.out.println("one1.number"+one1.getNumber());
        System.out.println("one2.number"+one2.getNumber());
         
         
        TwoSingleton two1 = TwoSingleton.getInstance();
        TwoSingleton two2 = TwoSingleton.getInstance();
        System.out.println("用twosingleton實現單例模式");
        System.out.println("抵用nextnumber方法以前:");
        System.out.println("two1.number="+two1.getNumber());
        System.out.println("two2.number="+two2.getNumber());
        two1.nextNumber();
        System.out.println("調用nextnumber方法後:");
        System.out.println("two1.number="+two1.getNumber());
        System.out.println("two2.number="+two2.getNumber());
    }
}

  

傳自:http://www.oschina.net/code/snippet_1993928_43925
相關文章
相關標籤/搜索