單例模式小結1:這裡隻保證單利模式不能被多次執行個體化,而且AS3不能像java那樣建立一個private的構造函數, 但是也可以用包外類的形式,傳遞一個參數,并且控制該參數隻能在此Singleton1才可傳遞; 1.Outter為該AS檔案的包外類,隻有該檔案内部可以通路。 2.Outter class中也隻有一個執行個體, 3.同時在Singleton的構造函數中的判斷也起到的加強的判斷效果。 這些都是防止其他人傳遞該As檔案外的其他類型,造成多次的執行個體化。
package {
import flash.display.MovieClip;
import fl.motion.easing.Sine;
public class Singleton1 extends MovieClip
{
public function Singleton1()
{
//1.檢驗是否可以不例化Singleton(答案是不可以。)************************
//同時檢驗是否可以再另外執行個體一個Outter類(結果是不可以)
//var singleton1:Singleton = new Singleton(new Outter());
//var singleton1:Singleton = new Singleton(null);
/*
輸出:
Outter
Outter
Error: 單例模式不能執行個體化!
at Singleton()
at Singleton1()
*/
//1********************************************************************
//2.驗證單利模式是否可以得到唯一一個執行個體。///
// var singleton:Singleton = Singleton.getInstance();
// var sin:Singleton = Singleton.getInstance();
// trace(sin == singleton);
/*
輸出:
Outter
true
Singleton Pattern
*/
/2 //
trace("Singleton Pattern");
}
}
}
/**
*Singleton 和OutpackageClass 一定要在一起。但Singleton作為一個單獨的類檔案的時候
*OutPackageClass一定要作為Singleton的包外類
*/
class Singleton
{
private var outter:Outter = Outter.instance;
private static var singleton:Singleton;
public function Singleton(outter:Outter){
if(outter == null || outter != this.outter )
{
throw new Error('單例模式不能執行個體化!');
}
}
public static function getInstance():Singleton
{
//outter = Outter.instance;
if(singleton == null)
{
singleton = new Singleton(Outter.instance);
}
return singleton;
}
}
class Outter
{
public static var instance:Outter = new Outter();
public function Outter()
{
trace("Outter");
}
}