Flashlizi's blog-专注Flash相关开发
posts - 22, comments - 14, trackbacks - 0, articles - 0
IT博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
AS3设计模式之一:单例模式(Singleton Pattern)
Posted on 2007-11-09 15:56
flashlizi
阅读(1889)
评论(2)
编辑
收藏
引用
所属分类:
AS3设计模式
什么是单例模式?
在面向对象的编程中,有时候会要求一个类有且仅存在一个实例,并提供一个全局的访问方法。所以我们在设计这样的类的时候,就需要思考如何避开构造函数,提供一种机制来实现单例(单一实例)。这就是单例模式。另因为在AS3中无法操作线程,因此我们无需考虑多线程情况下的单例。
单例模式的几种AS3实现
在AS3中有多种方法可以实现Singleton模式,首先看下面的方法1:
1
package
{
2
public
class
Singleton
{
3
private
static
var _instance:Singleton
=
new
Singleton();
4
public
function Singleton()
{
5
if
(_instance)
{
6
throw
new
Error(
"
只能用getInstance()来获取实例
"
);
7
}
8
}
9
public
static
function getInstance():Singleton
{
10
return
_instance;
11
}
12
}
13
}
此方法通过静态私有变量_instance来创建Singleton类的实例,通过getInstance方法来访问这个单一实例。另外,由于在AS3中不允许private、protected的构造函数,只能是public,因此需要防止用构造函数来创建Singleton类的实例。这个方法有个问题就是这个类的实例会在程序一开始就创建。
方法2:
1
package
{
2
public
class
Singleton
{
3
private
static
var _singleton:Boolean
=
true
;
4
private
static
var _instance:Singleton;
5
public
function Singleton()
{
6
if
(_singleton)
{
7
throw
new
Error(
"
只能用getInstance()来获取实例
"
);
8
}
9
}
10
public
static
function getInstance()
{
11
if
(
!
_instance)
{
12
_singleton
=
false
;
13
_instance
=
new
Singleton();
14
_singleton
=
true
;
15
}
16
return
_instance;
17
}
18
}
19
}
此方法通过一个静态私有变量_singleton来控制_instance的创建,保证其唯一性。并且这个方法不存在方法1中的问题,_instance实例只有在调用getInstance()方法后才会创建。
方法3:
1
package
{
2
public
class
Singleton
{
3
private
static
var singleton : Singleton;
4
public
function Singleton( caller : Function
=
null
)
{
5
if
( caller
!=
hidden )
{
6
throw
new
Error(
"
只能用getInstance()来获取实例
"
);
7
}
8
if
( Singleton.singleton
!=
null
)
{
9
throw
new
Error(
"
只能用getInstance()来获取实例
"
);
10
}
11
}
12
public
static
function getInstance():Singleton
{
13
if
( singleton
==
null
)
{
14
singleton
=
new
Singleton( hidden );
15
}
16
return
singleton;
17
}
18
private
static
function hidden():
void
{
19
}
20
}
21
}
此方法通过对构造函数增加参数来控制单个实例的创建。此构造函数只有传入参数为私有方法hidden的时候,才能创建实例。私有方法hidden对外的不可见性保证了单例的实现。
方法4:
1
package
{
2
public
class
Singleton
{
3
private
static
var _instance:Singleton;
4
public
function Singleton(singletoner:Singletoner)
{
5
if
(singletoner
==
null
)
{
6
throw
new
Error(
"
只能用getInstance()来获取实例
"
);
7
}
8
}
9
public
static
function getInstance():Singleton
{
10
if
(_instance
==
null
)
{
11
_instance
=
new
Singleton(
new
Singletoner());
12
}
13
return
_instance;
14
}
15
}
16
}
17
internal
class
Singletoner
{
18
}
此方法和方法3相似。这里利用了包外类对外的不可见性(Singletoner类仅在此as文件内可见)来保证单例的实现。
总结
单例模式的实现方式很多,在不同的需求下选择合适的才是最好的。比如方法1虽然一开始就会创建实例,但它不会像其他方法每次调用实例都要检查是否存在类的实例。Singleton模式只考虑实例的创建,而没有考虑到销毁,由垃圾回收机制自行处理。另外,你也可以扩展Singleton模式,比如稍做修改保证一个类只有少数几个实例,来实现一些特殊的目的,这样做也是合理和有意义的。
Feedback
#
re: AS3设计模式之一:单例模式(Singleton Pattern)[未登录]
回复
更多评论
2009-12-04 11:26 by
neo
学习了,谢谢
#
re: AS3设计模式之一:单例模式(Singleton Pattern)
回复
更多评论
2011-09-29 16:24 by
老姜
总结的很好,分享到我的博客喽!
刷新评论列表
博问 - 解决您的IT难题
IT新闻:
·
测试转开发,一个女孩子短短的工作心得
·
Michael Abrash:我是如何加入Valve 公司的
·
乌云爆料:网路岗可截获QQ密码和聊天记录
·
腾讯Q1广告收入8580万美元 首超新浪排名第一
·
有了MaKey Makey 石头也能变钢琴
博客园首页
IT新闻
IT问答
程序员招聘
标题
姓名
主页
验证码
*
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
博客园首页随笔:
·
Javascript MVVM模式前端框架—Knockout 2.1.0系列(1):初识Ko,了解Observable与computed
·
IT应届生求职推荐书单(C++)
·
每日看板反模式
·
crontab表达式
·
深入System.Web.Caching命名空间 教你Hold住缓存管理(二)
博客园
IT新闻
BlogJava
博客生活
C++博客
PHP博客
Powered by:
IT博客
Copyright © flashlizi
日历
<
2007年11月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
公告
因ZF禁止私自开设互动性质网站的原因,本人原来的blog网站:www.flashrek.com无限期暂停。而且虚拟空间访问速度慢,故在此开博,以后所有文章均在此发布。
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
(20)
AIR(1)
AJAX(5)
AS2(6)
AS3(7)
AS3设计模式(1)
Flex
随笔档案
(22)
2007年12月 (1)
2007年11月 (4)
2007年10月 (1)
2007年9月 (16)
搜索
最新评论
1. re: AS3设计模式之一:单例模式(Singleton Pattern)
总结的很好,分享到我的博客喽!
--老姜
2. re: 游戏开发者的AS3数据结构
HAO
--GGGG
3. re: 谈谈Actionscript中的惰性函数定义模式(Lazy Function Definition)
评论内容较长,点击标题查看
--resume writer
4. re: 谈谈Actionscript中的惰性函数定义模式(Lazy Function Definition)
不知道 LZ 这里说的惰性函数是不是可以理解成闭包?
如果是闭包的话,我觉得在 AS3 里面一定是不太好的。
1 有内存泄露问题。
2 不利于面向对象。
--ibio
5. re: 谈谈Actionscript中的惰性函数定义模式(Lazy Function Definition)
评论内容较长,点击标题查看
--dissertation writing
阅读排行榜
1. Input的特殊事件onpopertychange和oninput(2478)
2. AS3设计模式之一:单例模式(Singleton Pattern)(1889)
3. FlashTail:简单实用的Actionscript调试工具(1712)
4. 游戏开发者的AS3数据结构(1546)
5. 在firefox中获取网页里的SWF对象(1356)
评论排行榜
1. 谈谈Actionscript中的惰性函数定义模式(Lazy Function Definition)(5)
2. FlashTail:简单实用的Actionscript调试工具(4)
3. AS3设计模式之一:单例模式(Singleton Pattern)(2)
4. FlProject:我的第一个Flash CS3插件(1)
5. 游戏开发者的AS3数据结构(1)