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

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

网上或者在群里看到的单例写法蛮多,我也随便写点,也好给别人点参考。

目前作者常用的单例写法:

[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来创建实例,比起运行时才报错要更好一些。

 

单例,感觉在系统里比较适合同于一些管理器之类的功能,比如资源加载管理器,声音管理器等等。当然整个系统架构里面也会经常用到。单例模式应该算是最常用的设计模式之一。当然,单例也不能滥用!

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注