Actionscript 3.0中Singleton实现 修正篇

 更新时间:2009年02月16日 12:38:03   作者:  
说明:上一篇"一个简单的Actionscript的单态模式类"的实现在Actionscript中报错,具体原因会在这篇Blog中详细说明。
在前面的blog中,代码如下:
复制代码 代码如下:

package Src
{
/**
* Written by Leezhm, 10th February, 2009
* Contact : Leezhm@126.com
*
* An example of singleton class
**/
public class CSingleton
{
// variable
private static var _instance = new CSingleton();
protected function CSingleton()
{
}
public static function getInstance():CSingleton
{
if (undefined != CSingleton._instance)
{
return CSingleton._instance;
}
else
{
throw Error("Could not create the instace!");
}
}
}
}

Rebuild会出现1153:A constructor can only be declared public.错误,错误原因在错误描述语句描述的很清楚,也就是Constructor在Actionscript中只能声明为public。而我当时写的时候,犯了习惯性的错误,因为我学习的C++和C#中写singleton pattern总是将constructor声明为protected或者private,所以也就"理所当然"地这样写了(还是应该好好重视每种编程语言的基础,虽然都是标准的OO语言,但应该还是各有自己的特色的,不然也就没吸引力了)。既然这样,我们就无法保证用户不用new来创建singleton class对象了,在我思考中,同QQ群上一位网友讨论了哈,他给我推荐了一种解决方案,如下:
复制代码 代码如下:

Public function CSingleton()
{
Throw Error("error!");
}

但后来通过自己的测试,发现这样是不行的,Actionscript的异常机制貌似跟C#和C++不同,其实还是创建了对象,即使抛出了Exception(当然我没有很深入的测试,也许结果并不正确,但这里我要推荐另一种在Actionscript中实现singleton pattern的方法)。后来自己在网上找到一本好书《Advanced Actionscript 3 with Design Pattern》,在它的Part III中的Chapter 4中找到了关于Actionscript中singleton的讨论。

由于我们没法把constructor声明为private,那就可以给constructor传递一个private的variable,同样可以达到不能new的目的。但是怎么样才能让一个只对singleton class有private作用域的variable呢,我们要注意Actionscript的一些规则,比如在一个AS文件中只能有一个Package,一个和AS文件同名的Main Class。但我们在AS文件的包外声明一个class,而且这样声明的class只对package中的class有作用域,对包外是不可见的。所以可以如下来写这个Singleton class:
复制代码 代码如下:

package Src
{

/**
* Written by Leezhm, 14th February, 2009
* Contact : Leezhm@126.com
*
* An example of singleton class
**/

public class CSingleton
{
// variable
private static var _instance = new CSingleton(new SingletonEnforcer());

public function CSingleton(enforcer:SingletonEnforcer)
{
}

public static function getInstance():CSingleton
{
if (undefined != CSingleton._instance)
{
return CSingleton._instance;
}
else
{
throw Error("Could not create the instace!");
}
}

}
}

class SingletonEnforcer {}

BTW: 顺便附上一张电子书中关于Actionscript 3中Singleton Pattern Class讲解的照片,如下:
Actionscript 3 Singleton Pattern Class

相关文章

  • 火山动态文本滚动条V5[AS3版]

    火山动态文本滚动条V5[AS3版]

    功能说明:本版滚动条除了继续保持体积小(小于2K),界面容易修改,资源占用率小的优势外,主要有以下几点改进: 1,使用AS3编写。 2,宽高动态指定。 3,增加滚动条背景点击事件。 4,消除了鼠标滚轮无法同时准确控制多个文本框的重大BUG。
    2008-03-03
  • ActionScript 3.0 编程体验

    ActionScript 3.0 编程体验

    日前,Adobe公司发布了Flash的最新版本Flash Professional 9 ActionScript 3.0 Preview,这是Flash 9的预览版,正式版本估计要到2007年才会推出,
    2008-03-03
  • as3 rollOver or mouseOver使用说明

    as3 rollOver or mouseOver使用说明

    rollOver与mouseOver同样在鼠标移到目标上时触发事件,细微区别在于,mouseOver的bubbles等于true,而rollOver的bubbles是false.
    2009-10-10
  • AS3 navigateToURL导致ExternalInterface 执行失败问题

    AS3 navigateToURL导致ExternalInterface 执行失败问题

    AS3 navigateToURL导致ExternalInterface 执行失败问题
    2009-02-02
  • 编写高效率的AS3代码的小技巧

    编写高效率的AS3代码的小技巧

    最近我研究了一些AS3代码优化的文章,一般都是集中在研究loops 和 Number types上的,本文不在重复类似的测试
    2009-02-02
  • Actionscript 3.0 鼠标事件

    Actionscript 3.0 鼠标事件

    这本书是一本经典的书籍,说实话一些小的AS3的项目是做了好几个,基本的语法也都知道(其实有面向对象编程语言的基础后再入门一门新的语言还是很快的)。现在找到了这边经典书籍完整版,就好好看看,顺便写一些总结。
    2009-02-02
  • AS3打开新窗口不被屏蔽的代码

    AS3打开新窗口不被屏蔽的代码

    有时候flash打开的网址会出现被屏蔽的现象,如何能轻松的打开而不被屏蔽呢,下面是具体的代码。
    2010-08-08
  • AS3中的反射(速记) 分析

    AS3中的反射(速记) 分析

    详细了解AS3的反射,请google相关文章,这里只是速记一下
    2008-03-03
  • AS3自写类整理笔记 Dot类

    AS3自写类整理笔记 Dot类

    拖拽物体1和物体2,就可以看到效果了 index.base.geom.Dot类讲解 基本功能:记录xy两点
    2008-06-06
  • Actionscript 3.0中Singleton实现 修正篇

    Actionscript 3.0中Singleton实现 修正篇

    说明:上一篇"一个简单的Actionscript的单态模式类"的实现在Actionscript中报错,具体原因会在这篇Blog中详细说明。
    2009-02-02

最新评论