1. Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。
2. GOF实现(单线程模式)
public class Singleton
{
private static Singleton instance=null;
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
}
潜在的问题: 在单线程下, 此模式可以正确工作. 但是在多线程模式下,如果instance没有初使化,线程A运行完if(instance == null)判断后挂起, 线程B执行此代码判断, 会得到同样的结果去执行构造函数,得到两个实例.
注意此模式下构造函数修饰符是private,所以没有办法通过构造函数来产生实例, 只能通过Instance属性得到.
3. 多线程模式
a. 利用lock锁定
public class Singleton
{
private static Singleton instance=null;
private static readonly object padlock = new object();
private Singleton()
{
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
此种模式不错, 但是损失性能.
b. 利用静态构造器
public class Singleton
{
private static readonly Singleton instance=new Singleton();
private static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
其它还有许多实现变种, 如双重校验提高性能啊之内的.
值得一提的是在singleton模式中,一般不要实现序列化, 克隆方法. 否则可以根据此方法生成多个实例, 从而失去singleton模式的宗旨.
设计模式的关键就是隐藏构造函数,使其只能在类的内部被调用, 从而限制实例的生成. 对singleton模式稍加改变, 限制其生成的个数, 就可以改制成对象池. 如最多生成5个数据库连接.
本文详细介绍了Singleton模式的概念及其在单线程和多线程环境下的实现方法。探讨了不同实现方式的特点,包括使用锁机制和静态构造器的方式,并讨论了序列化和克隆对Singleton模式的影响。

被折叠的 条评论
为什么被折叠?



