• [设计模式]1.Singleton 单件(创建型模式)


    最近在学习设计模式,看的是李建忠(上海祝成科技高级培训讲师)的"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;
    }
    }
  • 相关阅读:
    2015.07-2015.08
    the last lecture
    强化的单例属性_Effective Java
    Socket通信客户端设计(Java)
    静态工场方法代替构造器
    如何控制Java中的线程,总结了3种方法...
    如何快速转型,比如C#...to...Java
    C#中var和dynamic
    How to use the Visual Studio
    mark blog
  • 原文地址:https://www.cnblogs.com/2008freestyle/p/1824285.html
Copyright © 2020-2023  润新知