Above all be of single aim;have a legitimate and useful purpose,and devote youself unreservedly to it.---James Alen
最重要的是单一的目标,有一个合法的和有用的目的,并毫无保留地奉献自己给它。
两个关键概念:
任何时候只能有一个类的实例被创建;一个类只能有一个,全局的访问点。
单例的一个基本条件,是类的构造器必须私有,以保证只能通过getInstance()方法获取唯一的实例。对于有些由于 是允许类的构造方法私有,例如java。但是在AS中,类的构造方法是不能私有的。
因为要做出一些变通,以达到类的构造方法私有的目标。
Singleton.as
1 package 2 { 3 /** 4 * ... 5 * @author liuyong 6 */ 7 public class Singleton 8 { 9 private static var singleton:Singleton; 10 public function Singleton(privateClass:PrivateClass) 11 { 12 13 } 14 public static function getInstance():Singleton { 15 if (Singleton.singleton == null) { 16 Singleton.singleton = new Singleton(new PrivateClass); 17 trace("Singleton instantiated"); 18 }else { 19 trace("sorry- already have a singleton instantiated"); 20 } 21 return Singleton.singleton; 22 } 23 24 } 25 26 } 27 Class PrivateClass { 28 public function PrivateClass(){trace("privateClass is up")} 29 }
此时不能通过 new Singleton()创建实例。因为需要一个private Class 参数 ,由于PrivateClass是内部类,因为外部也访问不到 ,因此参数也传递不过去,此时只能通过getInstance()获取实例。
三个使用场景: feedback反馈信息。音乐播放器,一次只能播放一个音乐文件。购物车。
单例模式不能被过度使用,仅仅当需要只有一份实例,或者一个入口的时候才考虑使用单例。因为单例可能会影响灵活性和重用性。
补充:单例的实现方式可以有很多种,可以使用内部Class的形式,同事也可以定义私有的静态变量,去标记是否实例化过。例如:private static var _lock:Boolean;