- 浏览: 17890 次
最新评论
在Flex/ActionScript3中实现单例
2010年03月01日
1. 概述 Singleton Pattern的关键在于,只允许有一个对象存在.有时候我们需要有且只有一个对象存在,如播放器播放的歌曲, 购物车中的总额等.这些类对象只能有一个实例,如果制造出多个实例,就会导致很多问题.单例模式也给了我们一个全局的访问点,相对于全局变量来说, 单例模式采用的时lazy instantiaze,即在需要这个实例时才会创建.如果不需要这个实例,则永远不会产生.
注意:
1.1 Singleton Pattern中有一个 private static 实例,它引用类的唯一的实例
1.2 通过一个public static method 来提供该实例的全局访问点. [如果为空则新创建一个]
1.3 构造函数定义为Private或使用其他方法来阻止在外部使用new来创建实例
2. 分析2.1 定义一个 Private static实例:private static var _instance:AppContext;
2.2 定一个Public static function 提供全局访问点:
public static function getInstance():AppContext {
if(!_instance) {
_instance = new AppContext(new PrivateClass);
}
return _instance;
}
2.3 相对与Java,Flex的构造函数必须为Public[因为ActionScript 3.0继承了当时的ECMAScript],而不能使用private,因此有可能通过new 来创建多个实例.
我们需要在构造函数为Public的时候防止在类外使用new创建类的实例.
OReilly.ActionScript.3.0.Design.Patterns中建议的方法:
在这种情况下,我们将构造函数参数中加入一个该类所在.as文件中的非主类[ActionScript 3.0 中一个as文件可以包含多个类,与文件名相同的类为主类,其他叫非主类,非主类只能在包内使用.]
class PrivateClass {
public function PrivateClass() {
trace("Private Class set up");
}
}
构造函数写为:
public function AppContext(pvt:PrivateClass) {
if(pvt == null) {
throw new Error("不用允许使用new来创建AppContex,请示使用getInstance");
}
}
但更为简洁的一个方法为:
public function AppContext() {
if(_instance != null) {
throw new Error("Singleton!");
}
}
3. 代码view plaincopy to clipboardprint?
package com.insprise.notemanagement { public class AppContext { private static var _instance:AppContext; private var _currentUser:int; public function AppContext() { if(_instance != null) { throw new Error("Singleton!"); } } public static function getInstance():AppContext { if(_instance == null) { _instance = new AppContext(); } return _instance; } public function get currentUser():int { return _currentUser; } public function set currentUser(currentUser_:int):void { _currentUser = currentUser_; } }//end of Class }//end fo package package com.insprise.notemanagement{public class AppContext{private static var _instance:AppContext;private var _currentUser:int; public function AppContext() {if(_instance != null) {throw new Error("Singleton!");}}public static function getInstance():AppContext {if(_instance == null) {_instance = new AppContext();}return _instance;}public function get currentUser():int {return _currentUser;}public function set currentUser(currentUser_:int):void {_currentUser = currentUser_;}}//end of Class}//end fo package
4. 测试两次通过getInstance创建实例,判断是否为同一个.使用该实例的 set currentUser方法,set currentUser,进一步确定两个实例是相同的.
view plaincopy to clipboardprint?
import com.insprise.notemanagement.AppContext; public function singletonTest():void { var firstSingleton:AppContext = AppContext.getInstance(); var secondeSingleton:AppContext = AppContext.getInstance(); trace(firstSingleton == secondeSingleton); firstSingleton.currentUser = 10; trace("Get firstSingleton.CurrentUser: " + firstSingleton.currentUser); trace("Get secondSingleton.CurrentUser: " + secondeSingleton.currentUser); secondeSingleton.currentUser = 20; trace("Get firstSingleton.CurrentUser: " + firstSingleton.currentUser); trace("Get secondSingleton.CurrentUser: " + secondeSingleton.currentUser); } import com.insprise.notemanagement.AppContext;public function singletonTest():void {var firstSingleton:AppContext = AppContext.getInstance();var secondeSingleton:AppContext = AppContext.getInstance();trace(firstSingleton == secondeSingleton);firstSingleton.currentUser = 10;trace("Get firstSingleton.CurrentUser: " + firstSingleton.currentUser);trace("Get secondSingleton.CurrentUser: " + secondeSingleton.currentUser);secondeSingleton.currentUser = 20;trace("Get firstSingleton.CurrentUser: " + firstSingleton.currentUser);trace("Get secondSingleton.CurrentUser: " + secondeSingleton.currentUser);}
测试结果:
Private Class set up
true
Get firstSingleton.CurrentUser: 10
Get secondSingleton.CurrentUser: 10
Get firstSingleton.CurrentUser: 20
Get secondSingleton.CurrentUser: 20
上面的例子第一次外界可以通过构造函数得到一个实例
严谨一点的做法为
public class Simple
{
private static var instance:Simple = null;
private static var canNew:Boolean = false;//<设置外界新建实例对象时不可以new出
public function Simple()
{
if(canNew && instance == null)
canNew = false;
else
throw new IllegalOperationError("Can't new SingletonFactory(),Please call getInstance()!");
}
public static function getInstance():Simple
{
if(instance == null)
{
canNew = true;
instance = new Simple;
}
return instance;
}
}
发表评论
-
html 特殊转义字符
2012-01-20 02:23 859html 特殊转义字符 2010年08月11日 HTM ... -
Notepad2 V4.1.24.62 免费版 是一个外观类似系统记事本的文本编辑工具
2012-01-20 02:23 785Notepad2 V4.1.24.62 免费版 是一个外观类似 ... -
简析HTML七种网页加密解密方法
2012-01-20 02:23 3967简析HTML七种网页加密解 ... -
IIS服务器排错指南及错误代码大全
2012-01-20 02:23 732IIS服务器排错指南及错误代码大全 2011年06月22日 ... -
游侠在线自由测试版正式发布啦!!!
2012-01-20 02:23 623游侠在线自由测试版正式发布啦!!! 2010年08月26日 ... -
介绍一些好玩的软件(有时间就更)
2012-01-19 10:12 724介绍一些好玩的软件(有时间就更) 2011年10月01日 ... -
英文有声读物网站(转贴)
2012-01-19 10:12 807英文有声读物网站(转贴) 2011年07月16日 国外 ... -
48个值得推荐的免费英文有声读物网站
2012-01-19 10:12 72748个值得推荐的免费英文有声读物网站 2011年09月02日 ... -
爱上绘本――盘点我和朗朗一年半的亲子阅读书目(自购书篇)
2012-01-19 10:12 776爱上绘本――盘点我和朗朗一年半的亲子阅读书目(自购书篇) 2 ... -
超右脑学习~那个小日本滴~
2012-01-19 10:12 549超右脑学习~那个小日本 ... -
MAX三百问(珍藏版)上
2012-01-17 02:53 627MAX三百问(珍藏版)上 2011年06月13日 安装篇 ... -
linux HoN 运行不流畅解决
2012-01-17 02:53 955linux HoN 运行不流畅解决 2011年02月13日 ... -
我们专业要用到的软件-AutoCAD系统要求,给即将买电脑的亲爱滴童鞋们点参考建议
2012-01-17 02:53 967我们专业要用到的软件-AutoCAD系统要求,给即将买电脑的亲 ... -
新萝卜家园 Ghost XP SP3 电脑城装机专用版 10.5
2012-01-17 02:53 778新萝卜家园 Ghost XP SP3 ... -
ActionScript 3 Flash大话设计模式(5)-工厂方法模式
2012-01-15 22:31 794ActionScript 3 Flash大话设计模式(5)-工 ... -
教学精品-3天学透Actionscript
2012-01-15 22:31 682教学精品-3天学透Actionsc ... -
何反编译ActionScript代码在SWF(How To Decompile Actionscript Code In Swf)
2012-01-15 22:30 1133何反编译ActionScript代码在SWF(How To D ... -
ActionScript3.0 垃圾回收机制 2010-4-19 雨
2012-01-15 22:30 618ActionScript3.0 垃圾回收机制 2010-4-1 ...
相关推荐
ActionScript 3.0里使用单例模式 ActionScript 3.0里使用单例模式
FLEX/FLASH ActionScript3 PPT讲义以及基于FLASH源码
Flex与ActionScript3程序开发》一书由易到难、由浅人深、循序渐进地介绍了Flex与ActionScript3程序开发的一般步骤与常用的程序技巧,内容通俗易懂,使用大量实例贯穿全书,力求以实战的形式让读者快速掌握知识点。...
Adobe Flex4.0 ActionScript3 中文API 语言参考.part1.rar的下载地址: http://download.csdn.net/source/3245173 Adobe Flex4.0 ActionScript3 中文API 语言参考.part2.rar的下载地址: ...
Flex与Actionscript3程序开发(源码)
相信读者在学习完《Flex与ActionScript 3程序开发》后,在使用Flex进行组件开发和数据处理、使用Flex高效制作皮肤、将Flex与Flash紧密结合、使用Flex与服务器端语言通信、对Flex应用进行优化等方面都会有深刻的理解...
本书由易到难、由浅人深、循序渐进地介绍了Flex与ActionScript3程序开发的一般步骤与常用的程序技巧,内容通俗易懂,使用大量实例贯穿全书,力求以实战的形式让读者快速掌握知识点。相信读者在学习完本书后,在...
Flex与ActionScript3程序开发-样章Flex与ActionScript3程序开发-样章Flex与ActionScript3程序开发-样章
flex中actionscript动态调用remoteobject类,很简单的一个例子,后面可以扩充,动态调用java的方法,可在java方法中放个switch,返回不同的结果集
FLEX开发入门的一本好书。讲解了actionscript的使用。
Adobe Flex4.0 ActionScript3 中文API 语言参考.part2.rar part1 的下载地址: http://download.csdn.net/source/3245173
用ActionScript3实现的单例模式
Flex与ActionScript.3
经典电子书 Flex与ActionScript 3程序开发
ActionScript教程 Flex教程 ActionScript+Flex教程。
pdf版的flex教程 actionscript3教程,适合初级学员学习 给大家分享一下
不错的poi和flex学习 欢迎大家多多学习
本参考可通过多种途径获得:在创作工具的“帮助面板”中;从 LiveDocs 下载获得。本参考适合与其它指导性媒体(如《ActionScript 3.0 编程》指南)和 Adobe 网站上的资源(如 ActionScript 主题中心)结合使用。
Flex 和 ActionScript 关系 Flex 和 ActionScript 关系