熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

可更新的注冊式的單實例模式

2013-11-23 19:42:42  來源: Java高級技術 

  最近遇到這樣一個應用在系統中需要大量的配置信息為了不每次都找數據庫或者配置文件需要一個生命周期和App一樣的容器(=靜態變量)但是在配置信息被修改時還需要去更新這個容器

  首先選用的是單實例模式單實例模式中又可分為惡漢懶漢以及一種基於餓漢型的注冊型

  個人感覺懶漢型單例模式沒什麼而餓漢型的更能體現java特點然注冊行的可擴展性較強個人感覺有點像

  一個實例工廠下面來一一列舉

  惡漢

  Java代碼

  

  public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton getInstance() { return m_instance; } }

  懶漢

  Java代碼

   public class LazySingleton {

    private static LazySingleton m_instance = null;

    private LazySingleton() {
    }

    synchronized public static LazySingleton getInstance() {
        if (m_instance == null) {
            m_instance = new LazySingleton();
        }
        return m_instance;
    }
}

  注冊型

  Java代碼

   public class RegSingleton {
    static private HashMap m_registry = new HashMap();
    static {
        RegSingleton x = new RegSingleton();
        m_registryput(xgetClass()getName() x);
    }

  
    protected RegSingleton() {
    }

    static public RegSingleton getInstance(String name) {
        if (name == null) {
            name = name;
        }
        if (m_registryget(name) == null) {
            try {
                m_registryput(name ClassforName(name)newInstance());
            } catch (Exception e) {
                Systemoutprintln(Error happened);
            }
        }
        return (RegSingleton) (m_registryget(name));
    }

  
}

  Java代碼

   public class RegSingletonChild extends RegSingleton {

    private RegSingletonChild() {
    }

    /**
     * 靜態工廠方法
     */
    static public RegSingletonChild getInstance() {
        return (RegSingletonChild) RegSingletongetInstance(name);
    }

}

  由於在我們這個系統中各種配置信息較多我個人感覺使用注冊型的單實例模式比較合適(還能應付對配置信息變化的要求)然後就需要給我們的單實例模式添加更新的行為了

  Java代碼

   public class ConfigClass {
    static private HashMap m_registry = new HashMap();
    static {
        ConfigClass x = new ConfigClass();
        m_registryput(xgetClass()getName() x);
    }

    /**
     * 保護的默認構造子
     */
    protected ConfigClass() {
    }

    /**
     * 靜態工廠方法返還此類惟一的實例
     */
    static public ConfigClass getInstance(String name) {
        if (name == null) {
            name = singleConfigConfigClass;
        }
        if (m_registryget(name) == null) {
            try {
                m_registryput(name ClassforName(name)newInstance());
            } catch (Exception e) {
                Systemoutprintln(Error happened);
            }
        }
        return (ConfigClass) (m_registryget(name));
    }
}

  Java代碼

   public class ConfigImpl extends ConfigClass {

private List properties = null;

    /**
     * @return the properties
     */
    public List getProperties() {
        return properties;
    }

    private ConfigImpl() {

        initalProperties();
    }

    public static ConfigImpl getInstance() {
        return (ConfigImpl) ConfigClassgetInstance(singleConfigokConfigImpl);
    }

    /**
     *
     * @author xiaofengbai<BR>
     * <B>Time</B> : 下午::
     */
    public void updateProperties() {
        ConfigImpl con = new ConfigImpl();

        properties = congetProperties();
    }

    /**
     * @author xiaofengbai<BR>
     * <B>Time</B> : 下午::
     */
    private void initalProperties() {
        // 初始化配置信息
    }
}

  呵呵終於完成了但是現在發現一個問題很暈我在ConfigImpl中的updateProperties()中有創建了一個ConfigImpl的實例這樣能完成我對properties的更新嗎?

  單實例顧名思義在一個JVM中只有一個實例這樣是否可行呢?


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27345.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.