^

Young Anything I do that may help others, I'll post it here.

Singleton Pattern

单例模式

影响
  1. 单例为相关使用它的类引入了紧密的耦合;
  2. 为测试带来了困难;
  3. 通常使用IOC容器来避免耦合和测试问题;
  4. 应该用IOC容器来管理对象声明周期。

线程不安全单例

普通单例
  1. 直接在单例上调用起内部方法;
  2. 可以将单例赋值给变量;
  3. 可以直接当参数传进其他方法;
  4. 线程不安全,不能用于多线程,如ASP.NET。

singleton

线程安全单例

单锁

singleLock

双锁

doubleLock

惰性单例
  1. 线程安全的惰性单例模式,其中用到的是嵌套类的静态构造函数。
  2. 静态构造函数是属于类的,而不是属于实例的,只会在创建第一个静态实例或引用其中的静态成员之前,由.NET自动调用,且只被调用一次。
  3. 静态构造函数没有访问修饰符,也没有参数。如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。

lazysingleton

anotherLazy

利用readonly关键字实现线程安全

静态初始化:在自己被框架加载时就将自己实例化。

readonly:instance标记上关键字readonly,意味着只能在静态初始化期间或类构造函数中分配变量。程序一加载就会为其赋值,所以不用再显式地编写线程安全代码。是一种饿汉式单例类,相对地,之前的在自己第一次被引用时才将自己实例化的,就属于懒汉式单例类。

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();
    private Singleton(){}
    public static Single GetInstance()
    {
        return instance;
    }
}

关联的模式

  • 抽象工厂
  • 工厂方法
  • 建造者

IOC Container

向容器注册好所需的每个对象及其接口。对象的构造函数如果需要其他对象,也一并注册好,然后容器在 resolve 所需的 object 时会自动的找到构造函数所需的参数,直接帮你构造好。