`

如何在ActionScript3.0里使用单例模式(Singleton Pattern) 转

阅读更多

   在ActionScript 3.0里使用单例模式(Singleton Pattern),原来也可以如此的多姿多彩!看了《Advanced ActionScript 3 with Design Patterns》一书后,才发觉以前我所写的单例模式并不是真正的单例模式,或者说是不完美的单例模式(至少在ActionScript 3.0里不应该那样写)。所谓单例,就是在整个应用程序中有且只有一个类的实例,也就是说某个类只能被 new 一次。

        为了得到一个类的实例,你会使用 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;
  6.  
  7.                 public function MyClass(enforcer:SingletonEnforcer) {}
  8.  
  9.                 public static function getInstance():MyClass {
  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里使用单例模式

    在ActionScript 3.0 (AS3) 中应用单例模式能够有效地管理资源,确保程序中某些关键组件只被实例化一次。 #### 二、ActionScript 3.0环境下的单例模式实现 ##### 2.1 单例的基本结构 在AS3中实现单例模式的核心...

    ActionScript3.0设计模式第一部分

    ActionScript3.0 设计模式 单例模式 MVC模式 Flash设计模式

    ActionScript3.0设计模式第二部分

    ActionScript3.0 设计模式 单例模式 MVC模式 Flash设计模式

    ActionScript 3.0 API文档(CHM+HTML最新中文完整)

    《ActionScript 3.0 语言和组件参考》概述 《ActionScript 3.0 语言参考》是 Flash® ... 应结合其它指导性媒体来使用本参考,例如《ActionScript 3.0 编程指南》以及 Adobe 网站上的资源(如 Flash 开发人员中心)。

    ActionScript 3.0开发技术大全(第一部分)

    第1篇 ActionScript3.0语言基础  第1章 ActionScript3.0概述  第2章 搭建ActionScript3.0开发环境  第3章 ActionScript3.0语法 第2篇 ActionScript3.0面向对象特性  第4章 ActionScript3.0面向对象编程  第...

    Flash ActionScript3.0教程示例(从入门到精通).rar

    《Flash ActionScript3.0教程示例(从入门到精通)》是一本全面解析ActionScript3.0编程语言在Flash平台上的应用的教程。ActionScript3.0是Adobe Flash Professional中的核心编程语言,用于创建交互式动画、游戏、富...

    actionscript 3.0动画制作教程

    在ActionScript 3.0中,动画的制作基于时间轴控制和编程控制两种方式。时间轴控制主要涉及关键帧和补间动画,而编程控制则通过代码实现更为复杂的动态效果。 1. **关键帧与补间动画**:在ActionScript 3.0中,你...

    ActionScript3.0 Game Programing中文版

    《ActionScript3.0 Game Programming》是一本专为游戏开发者设计的权威教程,中文版的出版使得更多中国读者能够深入理解和掌握ActionScript3.0在游戏开发中的应用。这本书不仅覆盖了ActionScript的基础语法和面向...

    ActionScript3.0转盘中奖游戏

    在这个“ActionScript3.0转盘中奖游戏”项目中,我们可以深入探讨ActionScript3.0的关键技术和转盘游戏的实现原理。 1. **ActionScript3.0基础** - **类与对象**:AS3.0采用了严格的面向对象编程,所有内容都是...

    ActionScript 3.0设计模式源码

    **ActionScript 3.0 设计模式源码详解** 在软件开发中,设计模式是一种解决常见问题的经验总结,它提供了一种在特定上下文中高效、可重用的解决方案。ActionScript 3.0(AS3)是Adobe Flash Platform的主要编程语言...

    ActionScript 3.0 编程.rar

    ActionScript 3.0 是Adobe开发的一种面向对象的编程语言,主要用于创建富互联网应用程序(RIA,Rich Internet Applications),尤其是在Flash平台上。它极大地提升了Flash Player和Adobe AIR应用的性能和功能,使得...

    ActionScript3.0完全自学手册电子教案_ActionScript3.0_

    ActionScript3.0是Adobe开发的一种面向对象的编程语言,主要用于创建富互联网应用程序(RIA),尤其是在Flash平台上。它是Flash Professional、Flash Builder等工具的核心组成部分,让开发者能够为网页、桌面和移动...

    ActionScript3.0宝典 pdf 高清晰

    ActionScript 3.0 是Adobe开发的一种编程语言,主要用于创建交互式内容,特别是在Flash和Flex平台上。这个“ActionScript 3.0 宝典”很可能是一本全面介绍该语言的教程,适合初学者和有一定经验的开发者。PDF版本...

    Flash ActionScript 3.0 编程技术教程(附书光盘)

    第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、ActionScript 3.0中常用类的使用、显示编程和组件类;第10、11章分别介绍了几个ActionScript 3.0实际应用的范例...

    ActionScript 3.0设计模式

    ActionScript 3.0设计模式

    ActionScript 3.0动态绘制正弦曲线(附源码)

    在“ActionScript 3.0动态绘制正弦曲线”这个项目中,开发者利用了AS3的强大功能来创建可视化图形,特别是数学中的正弦函数图像。以下是关于这个主题的详细知识点: 1. **ActionScript 3.0基础**: - AS3.0相较于...

    Foundation ActionScript 3.0 Animation

    《Foundation ActionScript 3.0 Animation》是一本...《foundation Actionscript3.0 Animation.pdf》这个文件很可能是这本书的电子版,包含完整的章节内容和可能的练习案例,对于自学或者参考来说是非常宝贵的资源。

    ACTIONSCRIPT 3.0 组件中文版

    综上所述,“ACTIONSCRIPT 3.0组件中文版”教程将涵盖这些关键概念,帮助读者掌握ACTIONSCRIPT 3.0组件的使用方法,从而提升在Flash平台上开发互动内容的能力。通过阅读提供的PDF文档,你将能深入了解ACTIONSCRIPT ...

Global site tag (gtag.js) - Google Analytics