打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ActionScript 3.0的单例模式
ActionScript 3.0的单例模式(2009-12-21 10:17:24)

转:http://www.riahome.cn/?p=154

 

一. Singleton的定义:确保某个class只有一个实例,而且提供一个全局的访问点

二.Singleton类基本上有这三个特征
大概的意思就是
1 . 有一个 private static 属性引用类的唯一的实例(Singleton Pattern中有一个 private static 实例,它引用类的唯一的实例
2 . 有一个 public static 方法来访问这个实例(如果实例已经被创建),或创建实例(如果实例还没被创建)(通过一个public static method 来提供该实例的全局访问点. [如果为空则新创建一个]
3 . 阻止用构造函数实例化这个类,这个一般使用私有的构造函数来实现,但由于AS3不支持private的构造函数,我们只能用其他的方法(构造函数定义为Private或使用其他方法来阻止在外部使用new来创建实例

 

三.Singleton详解

     Singleton Pattern的关键在于,只允许有一个对象存在.有时候我们需要有且只有一个对象存在,如播放器播放的歌曲, 购物车中的总额等.这些类对象只能有一个实例,如果制造出多个实例,就会导致很多问题.单例模式也给了我们一个全局的访问点,相对于全局变量来说, 单例模式采用的时lazy instantiaze,即在需要这个实例时才会创建.如果不需要这个实例,则永远不会产生.


 

    在ActionScript 3.0里使用单例模式(Singleton Pattern),原来也可以如此的多姿多彩!看了《Advanced ActionScript 3 with Design Patterns》一书后,才发觉以前我所写的单例模式并不是真正的单例模式,或者说是不完美的单例模式(至少在ActionScript 3.0里不应该那样写)。所谓单例,就是在整个应用程序中有且只有一个类的实例,也就是说某个类只能被 new 一次。好文齐分享,我把它转述如下,并收录在我博客了(www.RIAHome.cn):
        为了得到一个类的实例,你会使用 new 关键字,然后加上类名。这样会调用类的构造函数然后返回一个实例,就像这样:

  1.        var myObject:MyClass = new MyClass();

        相信你已经对这种实例化类的方式已经非常熟悉,但这种方法无法控制类的构造,所以我们准备使用一个静态方法:getInstance()。因为它被声明为静态(static),所以它是属于类而不是类的实例,不通过类的实例来调用它而直接使用类名来调用它。就像这样:

  1. public class MyClass {
  2.         public function MyClass() {}
  3.         public static function getInstance():MyClass {
  4.                 return new MyClass();
  5.         }
  6. }

        要得到类的实例,我们就可以使用这个静态的 getInstance() 方法:

  1.                 var myObject:MyClass = MyClass.getInstance();


防止类被实例化
        只要能通过 getInstance() 方法得到实例,那所有工作都已经是按计划进行了。但,我们注意到,这样始终不能防止他人通过 new 关键字来创建另一个实例。在一些语言里,可以把构造函数声明为私有(只能包内构造),这样就可以解决这个问题(In other languages this problem would be solved by making the constructor private)。但在ActionScript 3.0里这是不被支持的。
        这样的话,我们只能放一个大大的“public”关键字来声明构造函数为公有的,然后写上注释告诉其他人:“这个类只能被实例化一次”。那是不是就没有其它方法来防止一个类被实例化呢?一切皆有可能,方法当然是有的。我们可以利用面向对象的游戏规则来达到目的,不正当的语法是被禁止的。
        假如一个函数的参数没有默认值,在没有传递参数的情况下去调用这个函数,编译器就会报错。这是ActionScript 3.0的一个新特性,这个特性同样适用于构造函数。ActionScript 3.0还有一个新特性,在一个类文件里可以不只写一个类。也就是说在一个 .as 文件里可以写多个类。与文件名相同的那个类叫主类,主类只能有一个,其它类可以是任意多个,而且其它类只对包内可见,不能被外部引用。就像这样:

  1. package {
  2.  
  3.     public class MyClass {
  4.  
  5.         public function MyClass(enforcer:SingletonEnforcer) {}
  6.  
  7.         public static function getInstance():MyClass {
  8.             return new MyClass(new SingletonEnforcer());
  9.         }
  10.  
  11.     }
  12.  
  13. }
  14.  
  15. class SingletonEnforcer {}

现在你只能通过以下语句来创建类的实例,因为你不可能在外部通过 new 关键字来创建只对包内可见的 MyClass 类实例:

  1.         var myInstance:MyClass = MyClass.getInstance();

注意:事实上,您还可以把 null 作为参数传递给构造函数来 new 出一个 MyClass 类实例。每一种语言都不可能是完美的,但以上做法在ActionScript 3.0里已经能基本解决问题了。

        直到现在为止,你还不能创建单例,当你每次调用 getInstance() 方法时,都会创建一个新实例。下面我们将会了解到如何才能做到创建单例。

实现单例与全局变量
        我们需要怎样做才能保证 MyClass 类只实例化一次?现在,这个 getInstance() 方法可以被无限次地调用,然后无限次地 new 出很多个 MyClass 类,这无异于使用一个普通的公有构造函数。而我们只需要一个 MyClass 类型的实例,要这样的话,我们应该需要一个全局变量来保存这个唯一的实例,然后每次调用 getInstance() 方法时返回这个实例而不是重新 new 一个出来。就像这样:

  1. package {
  2.  
  3.         public class MyClass {
  4.  
  5.                 private static var _instance:MyClass; //定义一个 Private static实例
  6.  
  7.                 public function MyClass(enforcer:SingletonEnforcer) {}
  8.  
  9.                 public static function getInstance():MyClass { //定一个Public static function 提供全局访问点
  10.                         // 只有静态的私有变量 _instance 为null时才new出一个MyClass,
  11.                         // 当第二次调用这个静态的 getInstance() 方法时,因为 _instance 不为null,
  12.                         // 所以不再new出第二个 MyClass,而是直接返回已存在的 _instance。
  13.                         // 这样就保证了全世界只有一个 MyClass 类型的实例
  14.                         if(MyClass._instance == null) {
  15.                                 MyClass._instance = new MyClass(new SingletonEnforcer());
  16.                         }
  17.                         return MyClass._instance;
  18.                 }
  19.  
  20.         }
  21. }
  22.  
  23. class SingletonEnforcer {}

至此,一个单例模式就摆在眼前了。这不是翻译原文,跟原文已经不同了,所以有什么说得不当请指出来,也希望通过这篇文章,您会对ActionScript 3.0里的单例模式有所认识。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
设计模式读书笔记-----单例模式
面试被问设计模式?不要怕看这里:单例模式
单例模式
C# 设计模式-单例模式
设计模式之一(单例模式)
设计模式-----单例模式(Singleton Pattern)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服