关于单例模式的写法和理解

网上或者在群里看到的单例写法蛮多,我也随便写点,也好给别人点参考。 目前作者常用的单例写法: [codesyntax lang=”actionscript3”]

package
{
public class Test
{
private static var instance:Test=null;
public function Test(p:Param)
{
}
public static function getInstance():Test{
return instance=new Test(new Param());
}
}
}
class Param{}

[/codesyntax] “=”如果你觉得不好用,或者有问题的话,也可以换成常规的if判断。 作者使用单例写法历经了三个阶段: 第一阶段:仅加个getInstance。如下: [codesyntax lang=”php”]

package
{
public class Test
{
private static var instance:Test=null;
public function Test()
{
}
public static function getInstance():Test{
if(instance==null){
instance=new Test();
}
return instance;
}
}
}

[/codesyntax] 这种单例写法算是入门级的吧,无法防止别人通过new创建,只能靠人为的记住这个类是单例。   第二阶段:在构造函数抛错误 [codesyntax lang=”actionscript3”]

package
{
public class Test
{
private static var instance:Test=null;
public function Test()
{
if(instance!=null){
throw new Error(“this is a singleton class”);
}
}
public static function getInstance():Test{
if(instance==null){
instance=new Test();
}
return instance;
}
}
}

[/codesyntax] 这种写法,虽然可以防止别人通过new创建,但这要到运行的时候才会抛出错误。 第三阶段:加包外类参数 [codesyntax lang=”actionscript3”]

package
{
public class Test
{
private static var instance:Test=null;
public function Test(p:Param)
{
}
public static function getInstance():Test{
if(instance==null){
instance=new Test(new Param());
}
return instance;
}
}
}
class Param{}

[/codesyntax] 这种写法可以在编写代码的时候就避免别人通过new来创建实例,比起运行时才报错要更好一些。   单例,感觉在系统里比较适合同于一些管理器之类的功能,比如资源加载管理器,声音管理器等等。当然整个系统架构里面也会经常用到。单例模式应该算是最常用的设计模式之一。当然,单例也不能滥用!