Jack-Leung

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
这是用的最多的模式,每一个正式的软件都要用它,全局配置、唯一资源、还有一个就是所有的工厂我都设计为单件模式,因此它的使用量大于工厂模式和抽象工厂模式之和。

Singleton   用于需要确保在系统中仅存在类的一个实例时,例如全局状态保持类或工具类...

Singleton模式的实现基于两个要点:

1)不直接用类的构造函数,而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性,静态方法保证了不会创建出多余的实例。

2)将类的构造函数设为Private,即将构造函数"隐藏"起来,任何企图使用构造函数创建实例的方法都将报错。这样就阻止了开发人员绕过上面的Instance方法直接创建类的实例。

Singleton   分   Eager   initialization   和   Lazy   initialization   两种...

Eager   initialization   例子...

public   class   Singleton
{
        private   static   Singleton   instance   =   new   Singleton();

        public   static   Singleton   Instance()
        {
                return   instance;
        }
}

Lazy   initialization   例子...

public   class   Singleton
{
        private   static   Singleton   instance   =   null;

        public   static   Singleton   Instance()   {
                if   (instance   ==   null)   {
                      instance   =   new   Singleton();
                }
                return   instance;
        }
}

Eager   initialization   可能会造成资源的不合理分配,而   Lazy   initialization   则在每次取得实例引用时,会占用多余的时间...

不正确地使用   Singleton   模式可能会带来很多麻烦,尤其是在分布式系统中...

但如果正确地运用   Singleton   模式会提升系统效率...

因为Singleton模式具有这样实用的价值,开发人员除了可以在程序代码中直接使用Singleton模式外,在许多大型系统的实现上也都处处可见它的影子。在微软隆重推出的.NET框架中,同样也可以发现Singleton思想闪烁的光芒。

举例来说,在.NET框架的重要组成部分Remoting中,远程对象(Remote Object)有两种激活方式:服务器端激活方式和客户端激活方式。采用服务器端激活方式的对象又分为两种类型:Singleton对象和SingleCall对象。Singleton 对象是这样的对象:无论该对象有多少个客户端调用,它总是只有一个实例,由这个实例来处理所有的客户端请求。相反地,若将远程对象声明为 SingleCall,则系统会为每次客户端方法的调用创建一个新对象,即使这些方法调用来自同一个客户端,也即,对象只在方法调用持续期间存在,一旦方法调用结束,该对象就会被销毁。显而易见,这里的Singleton对象就是设计模式Singleton思想在.NET中的应用。

posted on 2011-03-22 17:09  Jack.leung  阅读(424)  评论(0编辑  收藏  举报