package Pattern;class OneSingleton{//第一種方式實現單例模式 PRivate static int number=0; //私有屬性 private static OneSingleton instance=new OneSingleton();//OneSingleton的唯一實例 private OneSingleton(){} //將構造函數私有化,防止外界構造OneSingleton實例 public static OneSingleton getInstance(){//獲取OneSingleton的實例 return instance; } public synchronized int getNumber(){//synchronized關鍵字表示方法是線程同步 return number;//任意時刻最多只能有一個線程進入該方法 } public synchronized void nextNumber(){//將number加1 number++; }}class TwoSingleton{//第二種方式實現單例模式 private static int number=0; //私有屬性 private static TwoSingleton instance=null;//TwoSingleton的唯一實例 private TwoSingleton(){} //將構造函數私有化,防止外界構造TwoSingleton實例 public static TwoSingleton getInstance(){//獲取TwoSingleton的實例 if(instance==null) { instance =new TwoSingleton(); } return instance; } public synchronized int getNumber(){//synchronized關鍵字表示方法是線程同步 return number;//任意時刻最多只能有一個線程進入該方法 } public synchronized void nextNumber(){//將number加1 number++; }}public class TextSingleton { public static void main(String[] args) { OneSingleton one1=OneSingleton.getInstance(); OneSingleton one2=OneSingleton.getInstance(); System.out.println("用第一種方式OneSingleton實現到單例模式"); 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()); }}源程序解讀1.OneSingleton 和 TwoSingleton類都實現了單例模式,區別是
第一種方法在類被加載的時候就創建類的唯一對象
private static OneSingleton instance=new OneSingleton();第二種方法是第一次調用 getInstance()方法時才創建類的唯一實例private static TwoSingleton instance=null;//TwoSingleton的唯一實例 public static TwoSingleton getInstance(){//獲取TwoSingleton的實例 if(instance==null) { instance =new TwoSingleton(); } return instance; } 2.在TwoSingleton類中,getInstance()方法聲明中使用了 synchronized(同步)關鍵字,以保證同一時刻只有一個線程進入該方法,這樣,就保證了只會新建一個對象3. 單例模式的實現方式將構造函數私有,以防止外界通過調用構造函數創建類的對象。將類的唯一對象保存為靜態私有屬性 private OneSingleton(){} 和private TwoSingleton(){},這個使用new OneSingleton() 和new TwoSingleton()的方式是不可行的 ,然后提供一個靜態公有方法getInstance()獲取該唯一對象,可以保證每次返回的都是同一個對象。
新聞熱點
疑難解答