天天看點

AS3 單例模式的加工,效果: 加強判斷

單例模式小結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");
	}
}