單列模式
-
<DIV align=left>什么是單列模式 </DIV></LI></UL>
<DIV class=content align=left><PRE id=best-answer-content class="reply-text mb10">單例模式就是某個類只存在一個對象(只new 一次),當某個類的初始化比較耗時,耗資源的時候,比如加載某些配置文件hibernate,spring的配置文件等,一般會選擇單例模式。</PRE>
當某個類的初始化比較耗時,耗資源的時候一般會選擇單例模式。
</DIV></PRE></DIV>-
<DIV align=left>單列模式的應用</DIV></LI></UL>
<DIV class=content align=left><PRE id=content-327022068 class="reply-text mb10">單例模式一般用在你不想實例化多個對象的地方,通常這類對象比較耗資源,還有加載默寫配置文件的時候,因為只需加載一次就可,鏈接數據庫時也可用單例模式,synchronized是java只是里的一個關鍵字,和單例是兩個概念,它用來保證同一個對象不被多個線程共同調用,因為多個線程同時調用一個對象會用問題,synchronized用在單例里面的意思是這個單例只會被一個線程調用,在多個線程內還是一個 </PRE></DIV>
<P align=left> </P>
-
<DIV align=left>單列模式舉例</DIV></LI></UL>
<DIV class=content><PRE id=content-326233511 class="reply-text mb10">單例模式是一種常見的設計模式,在《Java與模式》一書中,閻宏博士對單例模式做了全面的總結。 單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。 單例模式有一下特點: 1、單例類只能有一個實例。 2、單例類必須自己自己創建自己的唯一實例。 3、單例類必須給所有其他對象提供這一實例。 說明:一下的代碼來自閻宏博士的《Java與模式》一書,其中對一些類的寫法做調整(符合Java1.5的習慣),另外還加了測試方法。 一、懶漢式單例 在類被加載的時候,唯一實例已經被創建。這個設計模式在Java中容易實現,在別的語言中難以實現。 /**
- Created by IntelliJ IDEA.
- User: leizhimin
- Date: 2007-9-11
- Time: 14:57:08
- <<Java與模式>> 單例模式-懶漢式單例
*/
public class LazySingleton {
/**
private static LazySingleton m_intance=null; /*** 私有靜態對象,加載時候不做初始化 */
private LazySingleton(){ } /*** 私有構造方法,避免外部創建實例 */
synchronized public static LazySingleton getInstance(){* 靜態工廠方法,返回此類的唯一實例. * 當發現實例沒有初始化的時候,才初始化. * @return LazySingleton */
} } 二、餓漢式單例 在類加載的時候不創建單例實例。只有在第一次請求實例的時候的時候創建,并且只在第一次創建后,以后不再創建該類的實例。 /**if(m_intance==null){ m_intance=new LazySingleton(); } return m_intance;
- Created by IntelliJ IDEA.
- User: leizhimin
- Date: 2007-9-11
- Time: 14:45:25
- <<Java與模式>> 單例模式-餓漢式單例
*/
public class EagerSingleton {
/**
private static final EagerSingleton m_instance = new EagerSingleton(); /*** 私有的(private)唯一(static final)實例成員,在類加載的時候就創建好了單例對象 */
private EagerSingleton() { } /*** 私有構造方法,避免外部創建實例 */
public static EagerSingleton getInstance() {* 靜態工廠方法,返回此類的唯一實例. * @return EagerSingleton */
} } 三、登記式單例 這個單例實際上維護的是一組單例類的實例,將這些實例存放在一個Map(登記薄)中,對于已經登記過的實例,則從工廠直接返回,對于沒有登記的,則先登記,而后返回。 /**return m_instance;
- Created by IntelliJ IDEA.
- User: leizhimin
- Date: 2005-9-11
- Time: 15:20:16
- <<Java與模式>> 單例模式- 登記式單例
*/
public class RegSingleton {
/**
private static Map<String, RegSingleton> m_registry = new HashMap(); //在類加載的時候添加一個實例到登記薄 static {* 登記薄,用來存放所有登記的實例 */
} /**RegSingleton x = new RegSingleton(); m_registry.put(x.getClass().getName(), x);
protected RegSingleton() { } /*** 受保護的默認構造方法 */
public static RegSingleton getInstance(String name) {* 靜態工廠方法,返回指定登記對象的唯一實例; * 對于已登記的直接取出返回,對于還未登記的,先登記,然后取出返回 * @param name * @return RegSingleton */
} /**if (name == null) { name = "RegSingleton"; } if (m_registry.get(name) == null) { try { m_registry.put(name, (RegSingleton) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return m_registry.get(name);
public String about() {* 一個示意性的商業方法 * @return String */
} } 四、單例模式的一個應用 該應用是配置文件管理類。為了本例能正確運行,我在C盤下先建立了一個xxxx.properties文件,內容如下:return "Hello,I am RegSingleton!";
user=root password=leizhimin 這個配置文件管理類的代碼如下: /**
- Created by IntelliJ IDEA.
- User: leizhimin
- Date: 2005-9-11
- Time: 15:55:01
- 單例模式應用-單例類應用-配置文件管理
*/
public class ConfigManager {
/**
private static final String PFILE = "C:\xxx.properties"; /*** 屬性文件全名 */
private File m_file = null; /*** 對應于屬性文件的文件對象變量 */
private long m_lastModifiedTime = 0; /*** 屬性文件的最后修改日期 */
private Properties m_props = null; /*** 屬性文件所對應的屬性對象變量 */
private static ConfigManager m_instance = new ConfigManager(); /*** 本類可能存在的唯一的一個實例 */
private ConfigManager() {* 私有構造子,用以保證外界無法直接實例化 */
} /**m_file = new File(PFILE); m_lastModifiedTime = m_file.lastModified(); if (m_lastModifiedTime == 0) { System.err.println(PFILE + " file does not exist!"); } m_props = new Properties(); try { m_props.load(new FileInputStream(PFILE)); } catch (IOException e) { e.printStackTrace(); }
synchronized public static ConfigManager getInstance() {* 靜態工廠方法 * * @return ConfigManager */
} /**return m_instance;
public final Object getConfigItem(String name, Object defaultVal) {* 獲取屬性配置項的值 * * @param name * @param defaultVal * @return Object */
} } 測試配置文件類: /**long newTime = m_file.lastModified(); if (newTime == 0) { //屬性文件不存在 if (m_lastModifiedTime == 0) { System.err.println(PFILE + " file does not exist!"); } else { System.err.println(PFILE + " file was deleted!"); } return defaultVal; } else if (newTime > m_lastModifiedTime) { m_props.clear(); try { m_props.load(new FileInputStream(PFILE)); } catch (IOException e) { e.printStackTrace(); } } m_lastModifiedTime = newTime; Object val = m_props.getProperty(name); if (val == null) { return defaultVal; } else { return val; }
- Created by IntelliJ IDEA.
- User: leizhimin
- Date: 2007-9-11
- Time: 16:42:45
- 配置文件管理類測試
*/
public class Test_ConfigManager {
public static void main(String[] args) {
} } 運行結果: leizhimin root Process finished with exit code 0 </PRE></DIV>ConfigManager cfgm = ConfigManager.getInstance(); Object val1 = cfgm.getConfigItem("sdf", "leizhimin"); Object val2 = cfgm.getConfigItem("user", "leizhimin"); System.out.println(val1.toString()); System.out.println(val2.toString());
-
本文由用戶 逗號 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享! -