Actionscript 3.0中Singleton實(shí)現(xiàn) 修正篇
更新時(shí)間:2009年02月16日 12:38:03 作者:
說(shuō)明:上一篇"一個(gè)簡(jiǎn)單的Actionscript的單態(tài)模式類"的實(shí)現(xiàn)在Actionscript中報(bào)錯(cuò),具體原因會(huì)在這篇Blog中詳細(xì)說(shuō)明。
在前面的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會(huì)出現(xiàn)1153:A constructor can only be declared public.錯(cuò)誤,錯(cuò)誤原因在錯(cuò)誤描述語(yǔ)句描述的很清楚,也就是Constructor在Actionscript中只能聲明為public。而我當(dāng)時(shí)寫(xiě)的時(shí)候,犯了習(xí)慣性的錯(cuò)誤,因?yàn)槲覍W(xué)習(xí)的C++和C#中寫(xiě)singleton pattern總是將constructor聲明為protected或者private,所以也就"理所當(dāng)然"地這樣寫(xiě)了(還是應(yīng)該好好重視每種編程語(yǔ)言的基礎(chǔ),雖然都是標(biāo)準(zhǔn)的OO語(yǔ)言,但應(yīng)該還是各有自己的特色的,不然也就沒(méi)吸引力了)。既然這樣,我們就無(wú)法保證用戶不用new來(lái)創(chuàng)建singleton class對(duì)象了,在我思考中,同QQ群上一位網(wǎng)友討論了哈,他給我推薦了一種解決方案,如下:
Public function CSingleton()
{
Throw Error("error!");
}
但后來(lái)通過(guò)自己的測(cè)試,發(fā)現(xiàn)這樣是不行的,Actionscript的異常機(jī)制貌似跟C#和C++不同,其實(shí)還是創(chuàng)建了對(duì)象,即使拋出了Exception(當(dāng)然我沒(méi)有很深入的測(cè)試,也許結(jié)果并不正確,但這里我要推薦另一種在Actionscript中實(shí)現(xiàn)singleton pattern的方法)。后來(lái)自己在網(wǎng)上找到一本好書(shū)《Advanced Actionscript 3 with Design Pattern》,在它的Part III中的Chapter 4中找到了關(guān)于Actionscript中singleton的討論。
由于我們沒(méi)法把constructor聲明為private,那就可以給constructor傳遞一個(gè)private的variable,同樣可以達(dá)到不能new的目的。但是怎么樣才能讓一個(gè)只對(duì)singleton class有private作用域的variable呢,我們要注意Actionscript的一些規(guī)則,比如在一個(gè)AS文件中只能有一個(gè)Package,一個(gè)和AS文件同名的Main Class。但我們?cè)贏S文件的包外聲明一個(gè)class,而且這樣聲明的class只對(duì)package中的class有作用域,對(duì)包外是不可見(jiàn)的。所以可以如下來(lái)寫(xiě)這個(gè)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: 順便附上一張電子書(shū)中關(guān)于Actionscript 3中Singleton Pattern Class講解的照片,如下:
復(fù)制代碼 代碼如下:
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會(huì)出現(xiàn)1153:A constructor can only be declared public.錯(cuò)誤,錯(cuò)誤原因在錯(cuò)誤描述語(yǔ)句描述的很清楚,也就是Constructor在Actionscript中只能聲明為public。而我當(dāng)時(shí)寫(xiě)的時(shí)候,犯了習(xí)慣性的錯(cuò)誤,因?yàn)槲覍W(xué)習(xí)的C++和C#中寫(xiě)singleton pattern總是將constructor聲明為protected或者private,所以也就"理所當(dāng)然"地這樣寫(xiě)了(還是應(yīng)該好好重視每種編程語(yǔ)言的基礎(chǔ),雖然都是標(biāo)準(zhǔn)的OO語(yǔ)言,但應(yīng)該還是各有自己的特色的,不然也就沒(méi)吸引力了)。既然這樣,我們就無(wú)法保證用戶不用new來(lái)創(chuàng)建singleton class對(duì)象了,在我思考中,同QQ群上一位網(wǎng)友討論了哈,他給我推薦了一種解決方案,如下:
復(fù)制代碼 代碼如下:
Public function CSingleton()
{
Throw Error("error!");
}
但后來(lái)通過(guò)自己的測(cè)試,發(fā)現(xiàn)這樣是不行的,Actionscript的異常機(jī)制貌似跟C#和C++不同,其實(shí)還是創(chuàng)建了對(duì)象,即使拋出了Exception(當(dāng)然我沒(méi)有很深入的測(cè)試,也許結(jié)果并不正確,但這里我要推薦另一種在Actionscript中實(shí)現(xiàn)singleton pattern的方法)。后來(lái)自己在網(wǎng)上找到一本好書(shū)《Advanced Actionscript 3 with Design Pattern》,在它的Part III中的Chapter 4中找到了關(guān)于Actionscript中singleton的討論。
由于我們沒(méi)法把constructor聲明為private,那就可以給constructor傳遞一個(gè)private的variable,同樣可以達(dá)到不能new的目的。但是怎么樣才能讓一個(gè)只對(duì)singleton class有private作用域的variable呢,我們要注意Actionscript的一些規(guī)則,比如在一個(gè)AS文件中只能有一個(gè)Package,一個(gè)和AS文件同名的Main Class。但我們?cè)贏S文件的包外聲明一個(gè)class,而且這樣聲明的class只對(duì)package中的class有作用域,對(duì)包外是不可見(jiàn)的。所以可以如下來(lái)寫(xiě)這個(gè)Singleton class:
復(fù)制代碼 代碼如下:
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: 順便附上一張電子書(shū)中關(guān)于Actionscript 3中Singleton Pattern Class講解的照片,如下:

相關(guān)文章
火山動(dòng)態(tài)文本滾動(dòng)條V5[AS3版]
功能說(shuō)明:本版滾動(dòng)條除了繼續(xù)保持體積?。ㄐ∮?K),界面容易修改,資源占用率小的優(yōu)勢(shì)外,主要有以下幾點(diǎn)改進(jìn): 1,使用AS3編寫(xiě)。 2,寬高動(dòng)態(tài)指定。 3,增加滾動(dòng)條背景點(diǎn)擊事件。 4,消除了鼠標(biāo)滾輪無(wú)法同時(shí)準(zhǔn)確控制多個(gè)文本框的重大BUG。2008-03-03as3 rollOver or mouseOver使用說(shuō)明
rollOver與mouseOver同樣在鼠標(biāo)移到目標(biāo)上時(shí)觸發(fā)事件,細(xì)微區(qū)別在于,mouseOver的bubbles等于true,而rollOver的bubbles是false.2009-10-10AS3 navigateToURL導(dǎo)致ExternalInterface 執(zhí)行失敗問(wèn)題
AS3 navigateToURL導(dǎo)致ExternalInterface 執(zhí)行失敗問(wèn)題2009-02-02Actionscript 3.0中Singleton實(shí)現(xiàn) 修正篇
說(shuō)明:上一篇"一個(gè)簡(jiǎn)單的Actionscript的單態(tài)模式類"的實(shí)現(xiàn)在Actionscript中報(bào)錯(cuò),具體原因會(huì)在這篇Blog中詳細(xì)說(shuō)明。2009-02-02