单例设计模式(附AS3)

单态定义:
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。

另外方面,Singleton也能够被无状态化。提供工具性质的功能,
Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。

如何使用?
一般Singleton模式通常有几种形式:

public class Singleton {

private Singleton(){}

//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用

private static Singleton instance = new Singleton();

//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}

第二种形式:

public class Singleton {

private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance; }

}

使用Singleton.getInstance()可以访问单态类。

上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。

注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。

AS3的单例模式:

方法一:程序一开始就创建

package {  
    public class Singleton {  
        private static  var _instance:Singleton = new Singleton();  
        public function Singleton() {  
            if (_instance) {  
                throw new Error("只能用getInstance()来获取实例");  
            }  
        }  
        public static function getInstance():Singleton {  
            return _instance;  
        }  
    }  

方法2:解决1的问题了

package {  
    public class Singleton {  
        private static  var _singleton:Boolean=true;  
        private static  var _instance:Singleton;  
        public function Singleton() {  
            if (_singleton) {  
                throw new Error("只能用getInstance()来获取实例");  
            }  
        }  
        public static function getInstance() {  
            if (!_instance) {  
                _singleton=false;  
                _instance=new Singleton();  
                _singleton=true;  
            }  
            return _instance;  
        }  
    }  

posted @ 2010-12-01 18:52  模西的哥哥  阅读(397)  评论(0编辑  收藏  举报