动机:
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
这应该是类设计者的责任,而不是使用者的责任。
意图:
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
单线程Singleton模式的几个要点
• Singleton模式中的实例构造器可以设置为protected以允许子类派生。
• Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
• Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
• Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
• 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。
namespace 单例设计模式
{
public class Singleton
{
//定义一个静态变量
private static Singleton singleton;
public static object obj = new object(); //定义一个私有的构造函数
private Singleton() { } //定义一个静态初始化方法
public static Singleton Instance()
{
if (singleton == null)
{
lock (obj)
{
if (singleton == null)
{
singleton = new Singleton();
}
}
} return singleton;
}
}
} //针对C#语言特性,单例模式的简单实现方法
namespace 单态设计模式
{
public sealed class Singleton
{
//定义一个静态变量
private static readonly Singleton singleton = new Singleton(); //定义一个私有的构造函数
private Singleton() { } //定义一个静态初始化方法
public static Singleton Instance()
{
return singleton;
}
}
} //客户端代码
namespace 单例设计模式
{
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance(); if (s1 == s2)
{
Console.WriteLine("两个对象相等!");
}
else
{
Console.WriteLine("两个对象不相等!");
} Console.ReadKey();
}
}
}