Flashlizi's blog-专注Flash相关开发
posts - 22, comments - 17, trackbacks - 0, articles - 0
IT博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
AS3设计模式之一:单例模式(Singleton Pattern)
Posted on 2007-11-09 15:56
flashlizi
阅读(3644)
评论(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
老姜
总结的很好,分享到我的博客喽!
刷新评论列表
只有注册用户
登录
后才能发表评论。
Powered by:
IT博客
Copyright © flashlizi
日历
<
2010年7月
>
日
一
二
三
四
五
六
27
28
29
30
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
31
1
2
3
4
5
6
7
公告
因ZF禁止私自开设互动性质网站的原因,本人原来的blog网站:www.flashrek.com无限期暂停。而且虚拟空间访问速度慢,故在此开博,以后所有文章均在此发布。
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔分类
(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: Input的特殊事件onpopertychange和oninput
事实上是事实是事实飒飒
--发发发发发发发发发发发发发发发发发发发发
2. re: Input的特殊事件onpopertychange和oninput
fefefe
--fefe
3. re: 在firefox中获取网页里的SWF对象
评论内容较长,点击标题查看
--17作业
4. re: AS3设计模式之一:单例模式(Singleton Pattern)
总结的很好,分享到我的博客喽!
--老姜
5. re: 游戏开发者的AS3数据结构
HAO
--GGGG
阅读排行榜
1. Input的特殊事件onpopertychange和oninput(7236)
2. AS3设计模式之一:单例模式(Singleton Pattern)(3644)
3. FlashTail:简单实用的Actionscript调试工具(3133)
4. 游戏开发者的AS3数据结构(3127)
5. 在firefox中获取网页里的SWF对象(3024)
评论排行榜
1. 谈谈Actionscript中的惰性函数定义模式(Lazy Function Definition)(6)
2. FlashTail:简单实用的Actionscript调试工具(4)
3. AS3设计模式之一:单例模式(Singleton Pattern)(2)
4. Input的特殊事件onpopertychange和oninput(2)
5. AS2:实现动态文本的描边及阴影效果(1)