您好,登錄后才能下訂單哦!
一、概念
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。就筆者認為,單例就是不讓外界創建對象。
1.1概念剖析
對于單例的話,從上面的概念剖析,應該滿足下面的幾個條件:
第一:單例類中只能有一個單例對象;
第二:單例類必須自己創建自己的唯一實例對象;
第三:這個實例對象能夠給外界訪問到,并且外界不能夠自己創建對象。
二、常見幾種單例模式的方式
在java中,對于單例模式一般來說,分為懶漢式,餓漢式,以及登記式,但是登記式一般較少看到,所以也容易忽略。筆者若非今天突然想總結一下,在網上查找資料,也不會注意到這個。下面按照這種方式來貼出代碼,并進行解釋。
2.1餓漢式單例類
package com.ygh.singleton; /** * 餓漢式單例類 * @author 夜孤寒 * @version 1.1.1 */ public class HungerSingleton { //將構造方法私有,外界類不能使用構造方法new對象 private HungerSingleton(){} //創建一個對象 private static final HungerSingleton lazySinleton=new HungerSingleton(); //設置實例獲取方法,返回實例給調用者 public static HungerSingleton getInstance(){ return lazySinleton; } }
寫一個測試類,測試是不是實現單例:
package com.ygh.singleton; /** * 測試單例類 * * @author 夜孤寒 * @version 1.1.1 */ public class Test { public static void main(String[] args) { /* * 構造方法私有化,不能夠使用下面方式new對象 */ //HungerSingleton hungerSingleton=new HungerSingleton(); //使用實例獲取方法來獲取對象 HungerSingleton h2=HungerSingleton.getInstance(); HungerSingleton h3=HungerSingleton.getInstance(); System.out.println(h2==h3);//true } }
從上面可以看出:這個測試類的兩個引用是相等的,也就是說兩個引用指向的是同一個對象,而這也正好符合單例模式標準。到這里,餓漢式介紹結束。
2.2餓漢式單例類
package com.ygh.singleton; /** * 懶漢式單例類 * @author 夜孤寒 * @version 1.1.1 */ public class LazySingleton { //將構造方法私有,外界類不能使用構造方法new對象 private LazySingleton(){} //創建一個對象,不為final private static LazySingleton lazySingleton=null; //設置實例獲取方法,返回實例給調用者 public static LazySingleton getInstance(){ //當單例對象不存在,創建 if(lazySingleton==null){ lazySingleton=new LazySingleton(); } //返回 return lazySingleton; } }
測試類:
package com.ygh.singleton; /** * 測試單例類 * * @author 夜孤寒 * @version 1.1.1 */ public class Test { public static void main(String[] args) { /* * 構造方法私有化,不能夠使用下面方式new對象 */ //LazySingleton lazySingleton=new LazySingleton(); //使用實例獲取方法來獲取對象 LazySingleton l1=LazySingleton.getInstance(); LazySingleton l2=LazySingleton.getInstance(); System.out.println(l1==l2);//true } }
從上面可以看出:這個測試類的兩個引用是相等的,也就是說兩個引用指向的是同一個對象,而這也正好符合單例模式標準。到這里,懶漢式介紹結束。
2.3懶漢式和餓漢式的區別
懶漢式是當沒有對象的時候,就會創建一個單例對象,當有對象的時候,就不會再創建對象,這個說起來可能不是那么容易理解,但是讀者如果有興趣了解更深,可以在eclipse中使用斷點來測試,將LazySingleton類的if花括號內的內容加上斷點,然后在Test類中,使用debug運行,這樣子就能夠很容易體現出來,第一次創建了一個對象,但是第二次沒有創建對象。
餓漢式則是實現就用final這個關鍵字將對象創建好了,當調用者需要實例對象的時候,就可以通過getInstance這個方法獲取創建好的實例。
2.4登記式單例類
對于登記式單例類,筆者也不是很熟悉,貼了一段網絡上的代碼以供自己學習參考,請讀者自行學習。
import java.util.HashMap; import java.util.Map; /** * 登記式單例類 * @author Administrator * */ public class RegisterSingleton { private static Map<String, RegisterSingleton> map = new HashMap<String, RegisterSingleton>(); static { RegisterSingleton single = new RegisterSingleton(); map.put(single.getClass().getName(), single); } /* * 保護的默認構造方法 */ protected RegisterSingleton() { } /* * 靜態工廠方法,返還此類惟一的實例 */ public static RegisterSingleton getInstance(String name) { if (name == null) { name = RegisterSingleton.class.getName(); System.out.println("name == null" + "--->name=" + name); } if (map.get(name) == null) { try { map.put(name, (RegisterSingleton) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } /* * 一個示意性的商業方法 */ public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) { RegisterSingleton single3 = RegisterSingleton.getInstance(null); System.out.println(single3.about()); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。