java單例模式

來源:互聯網
上載者:User

單例模式單例模式是一種常見的設計模式,<br />單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。<br />單例模式有一下特點:<br />1、單例類只能有一個執行個體。<br />2、單例類必須自己自己建立自己的唯一執行個體。<br />3、單例類必須給所有其他對象提供這一執行個體。</p><p>一、懶漢式單例在類被載入的時候,唯一執行個體已經被建立。這個設計模式在Java中容易實現,在別的語言中難以實現。<br />單例模式-懶漢式單例<br />public class LazySingleton {<br /> /*** 私人靜態對象,載入時候不做初始化 */<br /> private static LazySingleton m_intance=null;<br /> /*** 私人構造方法,避免外部建立執行個體 */<br /> private LazySingleton(){}<br /> /*** 靜態Factory 方法,返回此類的唯一執行個體.* 當發現執行個體沒有初始化的時候,才初始化. * @return LazySingleton */<br /> synchronized public static LazySingleton getInstance(){<br /> if(m_intance==null){<br /> m_intance=new LazySingleton();<br /> }<br /> return m_intance;<br /> }<br />}</p><p>//測試一下單例模式<br /> LazySingleton lazySingleton = LazySingleton.getInstance();<br /> LazySingleton lazySingleton1 = LazySingleton.getInstance();</p><p> if(lazySingleton==lazySingleton1)){<br /> System.out.println("同一個對象執行個體");<br /> }else{<br /> System.out.println("不是同一個對象執行個體");<br /> }</p><p>二、餓漢式單例在類載入的時候不建立單例執行個體。只有在第一次請求執行個體的時候的時候建立,並且只在第一次建立後,以後不再建立該類的執行個體。<br />/***單例模式-餓漢式單例*/<br />public class EagerSingleton {<br /> /**私人的(private)唯一(static final)執行個體成員,在類載入的時候就建立好了單例對象*/<br /> private static final EagerSingleton m_instance = new EagerSingleton();<br /> /*** 私人構造方法,避免外部建立執行個體 */<br /> private EagerSingleton() {} //提供了一個空的構造方法<br /> /*** 靜態Factory 方法,返回此類的唯一執行個體.* @return EagerSingleton */<br /> public static EagerSingleton getInstance() {<br /> return m_instance;<br /> }<br />}</p><p>//下面來判斷一下有沒有達到單例效果(系統啟動並執行時候只出來一個空例)<br />EagerSingleton eagerSingleton = EagerSingleton.getInstance();<br />EagerSingleton eagerSingleton1 = EagerSingleton.getInstance();</p><p> if(eagerSingleton==eagerSingleton1)){<br /> System.out.println("同一個對象執行個體");<br /> }else{<br /> System.out.println("不是同一個對象執行個體");<br /> }</p><p>三、登記式單例這個單例實際上維護的是一組單例類的執行個體,將這些執行個體存放在一個Map(登記薄)中,對於已經登記過的執行個體,則從工廠直接返回,對於沒有登記的,則先登記,而後返回。<br />/*** 單例模式- 登記式單例*/<br />public class RegSingleton {<br /> /*** 登記薄,用來存放所有登記的執行個體 */<br /> private static Map<String, RegSingleton> m_registry = new HashMap();<br /> //在類載入的時候添加一個執行個體到登記薄<br /> static {<br /> RegSingleton x = new RegSingleton();<br /> m_registry.put(x.getClass().getName(), x);<br /> }<br /> /*** 受保護的預設構造方法*/<br /> protected RegSingleton() {}<br /> /*** 靜態Factory 方法,返回指定登錄物件的唯一執行個體;<br /> * 對於已登記的直接取出返回,對於還未登記的,先登記,然後取出返回<br /> * @param name<br /> * @return<br /> RegSingleton */<br />public static RegSingleton getInstance(String name) {<br /> if (name == null) {<br /> name = "RegSingleton";<br /> }<br /> if (m_registry.get(name) == null) {<br /> try {<br /> m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());<br /> } catch (InstantiationException e) {<br /> e.printStackTrace();<br /> } catch (IllegalAccessException e) {<br /> e.printStackTrace();<br /> } catch (ClassNotFoundException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> return m_registry.get(name);<br />} </p><p>/** * 一個示意性的商業方法 * @return String */<br />public String about() {<br /> return "Hello,I am RegSingleton!";<br />}}</p><p>四、單例模式的一個應用該應用是設定檔管理類。為了本例能正確運行,我在C盤下先建立了一個xxxx.properties檔案,內容如下:-------------------</p><p>user=rootpassword=leizhimin這個設定檔管理類的代碼如下:<br />單例模式應用-單例類應用-設定檔管理*/<br />public class ConfigManager {<br />/*** 屬性檔案全名*/<br />private static final String PFILE = "C://xxx.properties";<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.