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