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()); } }