Singleton Pattern
04 Mar 2019单例模式
影响
- 单例为相关使用它的类引入了紧密的耦合;
- 为测试带来了困难;
- 通常使用IOC容器来避免耦合和测试问题;
- 应该用IOC容器来管理对象声明周期。
线程不安全单例
普通单例
- 直接在单例上调用起内部方法;
- 可以将单例赋值给变量;
- 可以直接当参数传进其他方法;
- 线程不安全,不能用于多线程,如ASP.NET。
线程安全单例
单锁
双锁
惰性单例
- 线程安全的惰性单例模式,其中用到的是嵌套类的静态构造函数。
- 静态构造函数是属于类的,而不是属于实例的,只会在创建第一个静态实例或引用其中的静态成员之前,由.NET自动调用,且只被调用一次。
- 静态构造函数没有访问修饰符,也没有参数。如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
利用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 时会自动的找到构造函数所需的参数,直接帮你构造好。