11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2167|回复: 2
上一主题 下一主题

[设计模式] as3单例写法

[复制链接] TA的其它主题
发表于 2017-11-24 15:09:38 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 cdt 于 2017-11-24 15:19 编辑

 方法一:(显式允许new一次)
package
{
        import flash.errors.IllegalOperationError;
        import flash.events.EventDispatcher;
        import flash.utils.Dictionary;
        import flash.utils.getQualifiedClassName;

        public class DT1 extends EventDispatcher
        {
                private static var dict:Dictionary = new Dictionary();

                public function DT1()
                {
                        trace("运行DT1 ");
                        var ref:Class = this["constructor"] as Class;
                        if (dict[ref])
                        {
                                throw new IllegalOperationError((getQualifiedClassName(this) + " 只允许实例化一次!"));
                        }
                        else
                        {
                                dict[ref] = this;
                        }
                }
                /**
                         * 获取单例类,若不存在则创建
                         *
                         * @param ref继承自DT1的类
                         * @return
                         *
                         */

                public static function getInstanceOrCreate(ref:Class):*
                {
                        if (dict[ref] == null)
                        {
                                dict[ref] = new ref();
                        }

                        return dict[ref];
                }

        }

}
 方法二:(显式允许new一次)
package
{
        import flash.errors.IllegalOperationError;
        import flash.utils.getQualifiedClassName;
        
        public class DT2
        {
                private static var _instance:DT2 = null;
                public function DT2()
                {
                        trace("运行DT2 ");
                        if(_instance)
                         throw new IllegalOperationError(getQualifiedClassName(this)+" 只运行实例化一次!");
                }
                public static function getInstance():DT2
                {
                        return _instance ||= new DT2();
                }

        }

}
 方法三:(隐式允许new一次 利用包外类看上去好像一次new都不行)
package
{
        import flash.errors.IllegalOperationError;
        import flash.utils.getQualifiedClassName;
        
        public class DT3
        {
                private static var _instance:DT3 = null;
               
                public function DT3(instance:SureSingle=null)
                {
                        if(instance==null)
                         throw new IllegalOperationError(getQualifiedClassName(this)+" 是单例!");
                }
                public static function getInstance():DT3
                {
                        return _instance ||= new DT3(new SureSingle());
                }
        }      
}
internal class SureSingle{}
发表于 2017-11-24 15:19:43 | 显示全部楼层
:):(:D:'(
回复

使用道具 举报

发表于 2017-11-24 15:21:35 | 显示全部楼层
T:)T:(:D:'(
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表