<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

    BlogJava 聯系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    考慮使用 Singleton 模式 時擁有子類別的問題,在Singleton模式中的getInstance()通常是一個靜態方法,不能在子類別中重新定義它,關於子類別實例的產生交由getInstance()來進行是最好的選擇,例如:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton() {
            // ....
        }

        public static Singleton getInstance() {
            if (instance == null) {
                // getEnv表示系統環境變數
                String style = getEnv("style");

                if (style.equals("child1"))
                    instance = new ChildSingleton1();
                else if (style.equals("child2r"))
                    instance = new ChildSingleton2();
                else
                    instance = new Singleton();
            }

            return _instance;
        }

        // ....
    }

    上面這個程式片段改寫自 Gof 書中關於Singleton的例子,並用Java實現;在書中指出,這個例子的缺點是每增加一個子類別,getInstance()就必須重新修改,這個問題在Java中可以使用Reflection機制來解決:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton() {
            // ....
        }

        public static Singleton getInstance() {
            if (instance == null) {
                // getEnv表示環境變數
                String style = getEnv("style");

                try {
                    instance = (Singleton)
                              Class.forName(style).newInstance();
                }
                catch(Exception e) {
                    System.out.println(
                       "Sorry! No such class defined!");
                }
            }

            return instance;
        }

        // ....
    }

    上面的方式使用了Java的Reflection機制,並透過環境變數設定要產生的子類Singleton,如果不使用Reflection的話,Gof 書中提出的改進方法是使用Registry of Singleton方法:
    import java.util.*;

    public class Singleton {
        // 註冊表,用於註冊子類別物件
        private static Map registry = new HashMap();
        private static Singleton instance;

        public static void register(
                     String name, Singleton singleton) {
            registry.put(name, singleton);
        }

        public static Singleton getInstance() {
            if (instance == null) {
                // getEnv表示取得環境變數
                String style = getEnv("style");
                instance = lookup(style);
            }

            return instance;
        }

        protected static Singleton lookup(String name) {
            return (Singleton) registry.get(name);
        }
    }

    在Gof書中使用List來實現註冊表,而在這邊使用HasMap類別來實現,它是由Java SE所提供的;在父類別中提供一個register() 以註冊Singleton的子類別所產生之實例,而註冊的時機可以放在子類別的建構方法中加以實現,例如:
    public class ChildSingleton1 extends Singleton {
        public ChildSingleton1() {
            // ....
            // 註冊子類別物件
            register(getClass().getName(), this); 
        }
    }
     
    若要利用Singleton,則先使用這個子類別產生物件,這會向父類別註冊物件,之後透過Singleton父類別來取得物件:
    // 必須先啟始這段註冊程序
    // 產生並註冊ChildSingleton1物件
    new ChildSingleton1();
    // 產生並註冊ChildSingleton2物件
    new ChildSingleton2();

    // 註冊完成,可以使用父類別來取得子類的Singleton
    // 至於取回何哪一個,視您的環境變數設置決定
    Singleton childSingleton = Singleton.getInstance();
     

    這種方式的缺點是您必須在程式中啟始一段程序,先向父類別註冊子類的Singleton,之後才能透過父類別來取得指定的子類別Singleton實例,好處是可以適用於沒有Reflection機制的語言,如果您想要改變Singleton父類傳回的子類Singleton,可以在上面的 Singleton類別中加入一個reset()方法,將instance設定為null,然後重新設定環境變數,之後再利用 Singleton父類的getInstance()方法重新取得註冊表中的其它子類。

    事實上Registry of Singleton的真正優點正在於此,您可以使用父類別來統一管理多個繼承的子類別之Singleton實例,您可以在需要的時候再向父類別註冊子類 Singleton,必要時隨時調整傳回的子類別Singleton。
    posted on 2007-04-17 10:33 張金鵬 閱讀(396) 評論(1)  編輯  收藏 所屬分類: Creational 模式

    Feedback

    # re: Design Pattern: Registry of Singleton 模式[未登錄] 2012-03-19 21:43 nathan
    可惜子類的構造函數是public的  回復  更多評論
      

    主站蜘蛛池模板: 99久久免费国产精品热| 激情小说亚洲图片| 日本xxxx色视频在线观看免费| 亚洲高清最新av网站| 乱淫片免费影院观看| 亚洲?v无码国产在丝袜线观看| 免费在线观看自拍性爱视频| 免费在线观看黄色毛片| av成人免费电影| 伊人久久大香线蕉亚洲五月天| 国产一级一毛免费黄片| 亚洲第一精品福利| h片在线免费观看| 亚洲日韩AV无码一区二区三区人| 成人av免费电影| 直接进入免费看黄的网站| 亚洲精品动漫人成3d在线| 国产又黄又爽又大的免费视频 | 久久久久亚洲av成人无码电影| fc2免费人成在线| 久久噜噜噜久久亚洲va久| h片在线免费观看| 丰满亚洲大尺度无码无码专线| 亚洲无线一二三四区手机| 国产一级片免费看| 亚洲AV成人无码天堂| 可以免费观看一级毛片黄a| 中文字幕不卡免费高清视频| 日韩亚洲Av人人夜夜澡人人爽| 免费人成视频在线| 成人午夜免费视频| 精品亚洲aⅴ在线观看| 日本不卡高清中文字幕免费| av成人免费电影| 国产成人精品日本亚洲专| 又色又污又黄无遮挡的免费视| 免费视频一区二区| 亚洲日韩国产欧美一区二区三区| 亚洲乱码中文字幕久久孕妇黑人| 国产成人免费在线| 一个人看的www免费高清|