代码改变世界

Singleton(单例模式)

2009-06-08 11:05  周国选  阅读(600)  评论(0编辑  收藏

概念

设计模式的最显著的优点如下:

    ◆它们给你提供一个解决已有的并经过项目考验的类似问题的方案。这个解决方案促进复杂关系模块向着最低化耦合发展。它们将系统中可能存在的变化孤立起来,使整个系统更容易理解和维护。

    ◆设计模式是设计人员间的交流更为有效。软件专业人员可以马上在脑海中勾画出一个高水平的设计方案,并想到以前解决类似问题的设计模式的名称。

单例模式:在单例模式中,对活动的单例类只有一个实例。对单例类的所有实例化得到的都是相同的一个实例。这个模式也提供一个全局的接口来访问这个类的实例。

类图

时序图


实现

以下步骤实现单例模式:

第一步:

    创建一个Console Application的项目,命名为SingletonTest

第二步:
    加入一个名为
Singleton的类文件,并且加入一下代码:

/// <summary>
/// Summary description for Singleton.
/// </summary>

public class Singleton
{
//Fields
private static Singleton instance;

/// <summary>
/// Standard default Constructor 
/// </summary>

protected Singleton() {}

/// <summary>
/// Static method for creating the single instance 
/// of the Constructor
/// </summary>
/// <returns></returns>

public static Singleton Instance()
{
// initialize if not already done 
if( instance == null )
instance 
= new Singleton();

// return the initialized instance of the Singleton Class
return instance;
}

}


第三步:

创建一个客户端类,来访问这个单例类,如下:

/// <summary>
/// Summary description for Client.
/// </summary>

class Client
{
/// <summary>
/// The main entry point for the application.
/// </summary>

[STAThread]
static void Main(string[] args)
{
// Constructor is protected -- cannot use new
Singleton s1 = Singleton.Instance();
Singleton s2 
= Singleton.Instance();
if( s1 == s2 )
Console.WriteLine( 
"The same instance" );
Console.ReadLine();
}

}
 

第四步:

执行这个程序得到如下结果:


 

结论

这样我们用.Net framwork实现了一个单例模式的例子。像所有理论一样,单利模式也有它的优点和缺点。


单例模式的优点:

    1,实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。

    2,伸缩性:因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。


单例模式的缺点:

    1,系统开销。虽然这个系统开销看起来很小,但是每次引用这个类实例的时候都要进行实例是否存在的检查。这个问题可以通过静态实例来解决。

    2,开发混淆。当使用一个单例模式的对象的时候(特别是定义在类库中的),开发人员必须要记住不能使用new关键字来实例化对象。因为开发者看不到在类库中的源代码,所以当他们发现不能实例化一个类的时候会很惊讶。

    3,对象生命周期。单例模式没有提出对象的销毁。在提供内存管理的开发语言(比如,基于.NetFramework的语言)中,只有单例模式对象自己才能将对象实例销毁,因为只有它拥有对实例的引用。在各种开发语言中,比如C++,其它类可以销毁对象实例,但是这么做将导致单例类内部的指针指向不明。