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 實體可能遇到一些問題,
萬一有多個子類別都繼承同一個父類別怎麼辦?
推!!