單列模式

逗號 13年前發布 | 3K 次閱讀 Tails

  • <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(){ } /**
          * 靜態工廠方法,返回此類的唯一實例.  
          * 當發現實例沒有初始化的時候,才初始化.
          * @return LazySingleton
          */
          
          synchronized public static LazySingleton getInstance(){
             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)實例成員,在類加載的時候就創建好了單例對象
          */
          
          private static final EagerSingleton m_instance = new EagerSingleton(); /**
          * 私有構造方法,避免外部創建實例
          */
          
          private EagerSingleton() { } /**
          * 靜態工廠方法,返回此類的唯一實例.
          * @return EagerSingleton
          */
          
          public static EagerSingleton getInstance() {
             return m_instance;
          
          } } 三、登記式單例 這個單例實際上維護的是一組單例類的實例,將這些實例存放在一個Map(登記薄)中,對于已經登記過的實例,則從工廠直接返回,對于沒有登記的,則先登記,而后返回。 /**
        • 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() { } /**
          * 靜態工廠方法,返回指定登記對象的唯一實例;
          * 對于已登記的直接取出返回,對于還未登記的,先登記,然后取出返回
          * @param name
          * @return RegSingleton
          */
          
          public static RegSingleton getInstance(String name) {
             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);
          
          } /**
          * 一個示意性的商業方法
          * @return String
          */
          
          public String about() {
             return "Hello,I am RegSingleton!";
          
          } } 四、單例模式的一個應用 該應用是配置文件管理類。為了本例能正確運行,我在C盤下先建立了一個xxxx.properties文件,內容如下:

        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();
             }
          
          } /**
          * 靜態工廠方法
          *
          * @return ConfigManager
          */
          
          synchronized public static ConfigManager getInstance() {
             return m_instance;
          
          } /**
          * 獲取屬性配置項的值
          *
          * @param name
          * @param defaultVal
          * @return Object
          */
          
          public final Object getConfigItem(String name, Object defaultVal) {
             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) {
             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());
          
          } } 運行結果: leizhimin root Process finished with exit code 0 </PRE></DIV>
     本文由用戶 逗號 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
寫博客

博客分類