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