最近在学习设计模式,看的是李建忠(上海祝成科技高级培训讲师)的"C#面向对象设计模式纵横谈"的视频教程,该教程属于微软MSDN提供的webcast系列教程之一,在veryCD可以下载。
下载链接:http://www.verycd.com/topics/148585/
每听完一讲,把实现的代码做以注释整理,分享出来,如有错误不当之处,请批评指正。
第1种实现方式
namespace Singleton
{
/// <summary>
/// 第1种实现方式
/// </summary>
public class Singleton1
{
/// <summary>
/// 私有构造器,限制外部进行实例构造
/// </summary>
private Singleton1()
{
}
/// <summary>
/// 编译器在编译代码时会对代码的顺序作出微调,使用volatile就可以
/// 保证编译器不会对下面作出微调
/// </summary>
private static volatile Singleton1 _instance;
/// <summary>
/// 辅助器,不参与真正的构造
/// </summary>
private static Object _lockHelper = new object();
/// <summary>
/// 此时作用的是属性,不支持参数传递
/// 将属性改写为方法可支持参数传递
/// </summary>
public static Singleton1 Instance
{
get
{
//单线程不必使用double check
if (_instance == null)
{
//使用lock来避免多线程
lock (_lockHelper)
{
if (_instance == null)
{
_instance = new Singleton1();
}
//else
//{
// 如果该单例要实现参数传递,并将参数值传递给自身属性,
// 那么就将此属性改成方法,在此else语句赋传值
// 模式的扩展并不固定,可灵活处理
//}
}
}
return _instance;
}
}
}
}
第2种实现方式
namespace Singleton
{
/// <summary>
/// 第2种实现方式
/// 这种方式不支持参数的传递,但可以进行扩展
/// </summary>
public class Singleton2
{
private Singleton2()
{
}
public static readonly Singleton2 _instance = new Singleton2();
}
}
第3种实现方式
namespace Singleton
{
/// <summary>
/// 第3种实现方式,与第二种方法异曲同工
/// </summary>
public class Singleton3
{
private Singleton3()
{
}
/// <summary>
/// 1、静态构造函数既没有访问修饰符,也没有参数。
/// 2、在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类。
/// --也就是说我们无法直接调用静态构造函数,也不可能知道静态构造函数何时会被调用。
/// 3、一个类只能有一个静态构造函数。
/// 4、无参数的构造函数可以与静态构造函数共存。
/// --尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
/// 5、最多只运行一次。
/// 6、静态构造函数不可以被继承。
/// 7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
/// </summary>
static Singleton3()
{
_instance = new Singleton3();
}
/// <summary>
/// 静态字段一定只会在当前类的静态构造器初始化之后才有效
/// 例如,在外部使用该字段,编译器一定会先执行静态构造器
/// </summary>
public static readonly Singleton3 _instance;
}
}