醒着☆☆

H5 Laya Native Game

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

单例模式:顾名思义就是保证在各处使用的实例 是同一份。
比如一个项目 子模块里的数据model 或者全局的一些属性配置

例如:一个软件分:3个模块、由A B C  3个不同的人来负责开发。

A负责 登陆模块:存取用户名 性别 年龄 手机号码 。

B负责 发送短信给用户模块:需要使用登陆时,存取的用户的手机号码

C负责 用户信息管理模块:可以修改自己的注册信息

 

3个模块 大家都用到了 用户信息类 UserModel。

登录:存取信息userName userSex  age  tel 到UserModel

发送短信:需要使用登陆模块已经创建的 UserModel的实例的 tel

              或者修改模块改变后的UserModel实例的tel 

修改信息:需要使用UserModel 完整的信息。

 

这3个人要保证他们吃用的UserModel信息是最新的 且统一的。

当然有些人说了:这些信息 完全可以每次从数据库里读取啊

可是下面的单例模式会更好。

UserModel.as 类 定义了用户信息类 方便存取

package com.siglton
{
    public class UserModel
    {
        public var userName:String;
        public var userAge:int;
        public var tel:String;
        public var sex:int;
        public function UserModel()
        {
        }
    }
}

 

这个类定义好了。

A程序员 做登录模块

 

package com.siglton
{
    import flash.text.TextField;
    public class Login
    {
        public static const LOGIN_SUCCESSFUL:String="LOGIN_SUCCESSFUL";
        //实例化 输入框 组件 
        private var _nameTxt:TextField;
        private var _sexTxt:TextField;
        private var _telTxt:TextField;
        private var _ageTxt:TextField;
        public function Login()
        {
        }
        private function doLogin():void
        {
            //现在这样使用 是不能满足 单例 模式的 。。。。
            var userModel:UserModel=new UserModel();
            userModel.userName=_nameTxt.text;
            userModel.userAge=int(_ageTxt.text);
            userModel.sex=int(_sexTxt.text);
            userModel.tel=_telTxt.text;
            //存取类 信息完毕
            dispatchEvent(LOGIN_SUCCESSFUL)
        }
    }
}

A程序员 感觉上他的工作已经完成了。

但是问题来了。B、C程序员他们怎么使用 A程序员的UserModel的数据呢?

难道让A把自己实例好的的userModel 传参给B C 吗?那如果以后又加入很多模块呢 D E F....Z?

甚至子模块还有子模块 d1  d2 ....怎么办?

正确的做法:单例模式正式出场了。

 

package com.siglton
{
    public class UserModel
    {
        public var userName:String;
        public var userAge:int;
        public var tel:String;
        public var sex:int;
        //加入参数的构造  外部是不能访问的 。。。要访问 则 必须使用 getInstance 方法
        public function UserModel(_signel:Signel)
        {
        }
        //新加入的代码   1个私有 静态 属性    和  一个 公开 静态 方法
        private static var _instance:UserModel;
        public static function getInstance():UserModel
        {
            if(!_instance)
            {
                _instance=new UserModel(new Signel());
            }
            return _instance;
        }
    }
}
//此类  供传递给 UserModel的构造 
class Signel{}

 

这时的UsreModel 类 实现了 全局统一 共享。

我们使用这个唯一的类时 ,不再能通过构造函数来使用了。

取而代之的是 ,大家都必须使用UserModel.getInstance()来获得他。他是唯一的。

好。现在改变A的代码了。因为不能通过构造函数来获得实例的。

package com.siglton
{
    import flash.text.TextField;

    public class Login
    {
        public static const LOGIN_SUCCESSFUL:String="LOGIN_SUCCESSFUL";
        //实例化 输入框 组件 
        private var _nameTxt:TextField;
        private var _sexTxt:TextField;
        private var _telTxt:TextField;
        private var _ageTxt:TextField;
        public function Login()
        {
        }
        private function doLogin():void
        {
            //现在这样使用 是不能满足 单例 模式的 。。。。
            var userModel:UserModel=UserModel.getInstance();
            userModel.userName=_nameTxt.text;
            userModel.userAge=int(_ageTxt.text);
            userModel.sex=int(_sexTxt.text);
            userModel.tel=_telTxt.text;
            //存取类 信息完毕
            dispatchEvent(LOGIN_SUCCESSFUL)
        }
    }
}

这样 B、C程序员就很方便的获得这个A存取的UserModel实例了

发送短信模块

 

package com.siglton
{
    public class SendMsg
    {
        private var _tel:String;
        private var _name:String;
        public function SendMsg()
        {
            var userModel:UserModel=UserModel.getInstance();
            _tel=userModel.tel;
            _name=userModel.userName;
            //发送一条 短信给 用户
            var msg:String="您好"+_name+",恭喜你在《中国好声音》中抽奖中 特等奖500万。请尽快汇100万手续费。我们会尽快办理您的领奖手续。";
            MsgSender.send(msg,_tel);
        }
    }
}

发送模块 使用了 电话 tel 。而C 做的修改信息 模块 ,可能会更改这个tel的。怎么办?

不用管其他人怎么修改Usermodel。因为UserModel是唯一的 统一的。

 

 

 

总结:

单例模式实现必要元素
1 private static var _instance:XXXXX

2 public static function getInstance():XXXXX

主要应用场合:

共用数据信息类 。

 

posted on 2012-11-29 11:13  醒着/☆☆  阅读(281)  评论(0编辑  收藏  举报