Singleton Pattern在設計模式中, 是最常用到的
寫 game , 或是管理資訊, 傳值接值, 都非常的好用
但是如果要去繼承該類別呢?
最近在專案上遇到了類似的問題
Main.swf和Child.swf,共用同一個Singleton類別
理當一切都很完美
但現在Main.swf裡Singleton裡的某個方法, 是把另外一個單元裡的swc類別給加進去(大個100k)
且 Singleton 可能要經常改函式裡的程式碼, 這樣每次都要發怖二次。
而透過 Singleton 的 extends
child.swf用一個 Singleton 類別。
Main.swf用繼承 Singleton ,這樣二隻swf檔一樣可以共用同一個實體。
這樣就很適合在多人合作時, 大家要共用一個 singleton 類別
給別人簡單版的 Singleton, 而主程式的 Singleton 就可以寫上其他功能。
寫 game , 或是管理資訊, 傳值接值, 都非常的好用
但是如果要去繼承該類別呢?
最近在專案上遇到了類似的問題
Main.swf和Child.swf,共用同一個Singleton類別
理當一切都很完美
但現在Main.swf裡Singleton裡的某個方法, 是把另外一個單元裡的swc類別給加進去(大個100k)
且 Singleton 可能要經常改函式裡的程式碼, 這樣每次都要發怖二次。
而透過 Singleton 的 extends
child.swf用一個 Singleton 類別。
Main.swf用繼承 Singleton ,這樣二隻swf檔一樣可以共用同一個實體。
這樣就很適合在多人合作時, 大家要共用一個 singleton 類別
給別人簡單版的 Singleton, 而主程式的 Singleton 就可以寫上其他功能。
一般 Singleton 的寫法, 新增一個 updateInstance 函式給子類別呼叫。
/** * @author milkmidi * @see http://milkmidi.blogspot * @version 1.0.1 * @date created 2010/03/29/ */ package milkmidi.test { import flash.events.Event; import flash.events.EventDispatcher; public class MSingleton extends EventDispatcher { private static var _instance:MSingleton; protected namespace singleton; public var name: String = "MSingleton"; public function MSingleton(pSingletonEnforcer:SingletonEnforcer) { if ( !(pSingletonEnforcer is SingletonEnforcer)) throw new Error("Singleton is obviously... Singleton."); } public static function getInstance():MSingleton { return MSingleton._instance ||= new MSingleton(new SingletonEnforcer()); } /** * 自定一個函式, 讓子類別來呼叫, 更新 _instance。 * 使用 namespace 來定義, 是不想讓子類別能直接呼叫。 * @param pInstance */ singleton function updateInstance(pInstance:MSingleton):void { if (pInstance is MSingleton) _instance = pInstance; else throw new Error("Incorrect Singleton update"); } public function destroy():void { _instance = null; } override public function toString():String { return "[MSingleton]"; } singleton static function get singletonEnforcerClass():Class { return SingletonEnforcer; } } } internal class SingletonEnforcer {}繼承版Singleton, 在getInstance時去呼叫父系namespace的 updateInstance 函式
/** * @author milkmidi * @see http://milkmidi.blogspot * @version 1.0.1 * @date created 2010/03/29/ */ package milkmidi.test { import flash.events.Event; public class MSingletonExtend extends MSingleton { private static var _instance :MSingletonExtend; private static var _isUpdated :Boolean = false; public function MSingletonExtend( pSingletonError:* ) { super( pSingletonError ); //trace("*** SingletonExtended Constructor ***"); if (_instance != null) throw new Error("SingletonExtended is obviously also... Singleton."); } public static function getInstance():MSingletonExtend { if (_instance == null) _instance = new MSingletonExtend( new MSingleton.singleton::singletonEnforcerClass() ); if (!_isUpdated) { MSingleton.getInstance().singleton::updateInstance(_instance); _isUpdated = true; } return _instance; } override public function toString():String { return "[MSingletonExtend]"; } } }測試,成功。
/** * @author milkmidi * @see http://milkmidi.blogspot * @version 1.0.1 * @date created 2010/03/29/ */ package { import flash.display.Sprite; import flash.events.Event; import milkmidi.test.MSingleton; import milkmidi.test.MSingletonExtend; public class MSingletonDemo extends Sprite{ public function MSingletonDemo() { //父類別 MSingletonExtend name 屬性 trace("MSingletonExtend.getInstance().name:", MSingletonExtend.getInstance().name); //修改父類別 MSingletonExtend name 屬性為 milkmidi MSingletonExtend.getInstance().name = "milkmidi"; //子類別 MSingleton name 屬性, 一樣得到修改過後的 milkmidi trace("MSingleton.getInstance().name:", MSingleton.getInstance().name); //偵聽子類別 MSingleton 的 complete 事件。 MSingleton.getInstance().addEventListener(Event.COMPLETE , _completeHandler) //同時發怖。 MSingletonExtend.getInstance().dispatchEvent(new Event(Event.COMPLETE)); MSingleton.getInstance().dispatchEvent(new Event(Event.COMPLETE)); } private function _completeHandler(e:Event):void { //發偵聽到二次, 而發送事件者即是父系的 MSingletonExtend trace("e.currentTarget:", e.currentTarget, "e.target:",e.target); } } }
留言
這樣用子類別 Singleton 實體蓋掉父類別的 Singleton 實體可能遇到一些問題,
萬一有多個子類別都繼承同一個父類別怎麼辦?
推!!