请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 新增登录提醒插件 - 用至我的站点 地图任务一定要做 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

MIUI手机主题设计大赛,奔驰大奖等你拿! 想加薪?!蓝色理想招聘提供你更多机会 悬赏答疑,赚取积分兑奖品!

查看: 2224|回复: 7

[AS3] AS3设计模式之一:单例模式(Singleton Pattern) [复制链接]

flashlizi 楼主
帖子
521
体力
2366
威望
131
发表于 2007-11-9 16:08:26 |显示全部楼层
什么是单例模式?

在面向对象的编程中,有时候会要求一个类有且仅存在一个实例,并提供一个全局的访问方法。所以我们在设计这样的类的时候,就需要思考如何避开构造函数,提供一种机制来实现单例(单一实例)。这就是单例模式。另因为在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():Singleton{
  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模式,比如稍做修改保证一个类只有少数几个实例,来实现一些特殊的目的,这样做也是合理和有意义的。
西部数码云主机4G内存500G仅需423元

目光呆滞的狐狸

高级会员

帖子
1069
体力
1131
威望
0
居住地
广东省 广州市
发表于 2007-11-10 11:30:39 |显示全部楼层

还有一种就是实例类写在包外类,包内类只提供获取包外类的方法
  1. package
  2. {

  3. public class Singleton{
  4.         
  5.         private static var _instance:Singletoner ;
  6.         public  function Singleton() {
  7.                throw new Error("只能用getInstance()来获取实例");
  8.          }
  9.         public static function getInstance():Singletoner {
  10.                 if(_instance== null){
  11.                         _instance= new Singletoner();
  12.                 }
  13.                 return _instance;
  14.         }
  15.     }

  16. }

  17. class Singletoner {
  18.         function Singletoner(){

  19.        }
  20. }
复制代码
君子动手不动口
租服务器,上51IDC

使用道具 举报

帖子
120
体力
334
威望
2
发表于 2007-11-10 14:00:27 |显示全部楼层
顶,太好了。
要能多出些编程模式的资料就更好了。。。。,

使用道具 举报

CK同伈鎖

荣誉管理

帖子
4640
体力
19244
威望
372
发表于 2007-11-16 00:59:57 |显示全部楼层
对代码的追求是一方面,
但是在开发的过程中不可能出现带着重磅型构造函数的类吧, 那直接在静态函数里初始化不就好了, 省时省力

使用道具 举报

熟练的新手

中级会员

帖子
103
体力
220
威望
2
居住地
湖北省 武汉市
发表于 2007-11-16 09:06:12 |显示全部楼层
啊  。。  我是第100 个游览者...  哈哈   运气 不错。。

这个设计 模式 是不是翻译的 那本 AS3的新书?

要能  多翻 些就好 。。。    谢谢 楼主了.....

使用道具 举报

经典杀手

荣誉管理 手机认证 

帖子
2619
体力
11807
威望
14
发表于 2007-11-20 14:04:44 |显示全部楼层
java里面的内容,不错as3做的这么不错了,最近由于工作的需要也在研究。
http://www.javaedu.com有新变化了...

使用道具 举报

帖子
148
体力
629
威望
0
发表于 2009-6-16 14:38:13 |显示全部楼层
提醒:最后回贴距现在 575 天,请不要无意义回复

哇卡卡卡卡。。。。。。

我的解决办法是: 将需要实现单例的类全部在文档类中实例化,然后由文档类提供出一个方法供其它类调用。。。
不知道这样做好不好?
这条旧路依然没有改变

使用道具 举报

帖子
347
体力
724
威望
0
发表于 2009-6-17 17:39:54 |显示全部楼层
文档类需要有对外接口么?继承的接口不算.

使用道具 举报

您需要登录后才可以回帖 登录 | 注册


Archiver|手机版|blueidea.com ( 京ICP备05002321号 )    

GMT+8, 2012-5-25 15:13 , Processed in 0.131195 second(s), 7 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部