单例模式:顾名思义就是保证在各处使用的实例 是同一份。
比如一个项目 子模块里的数据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 类 定义了用户信息类 方便存取
{
public class UserModel
{
public var userName:String;
public var userAge:int;
public var tel:String;
public var sex:int;
public function UserModel()
{
}
}
}
这个类定义好了。
A程序员 做登录模块
{
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 ....怎么办?
正确的做法:单例模式正式出场了。
{
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的代码了。因为不能通过构造函数来获得实例的。
{
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实例了
发送短信模块
{
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
主要应用场合:
共用数据信息类 。