C#设计模式(单例模式)
单例模式(单线程和多线程)
单例模式的三种写法
单例模式的优缺点
深度探讨单例模式的应用场景
需求分析:
1.对象在构造的时候会耗时间或者占用资源
2.很多地方都需要用到这个对象
3.不同的地方使用一个实例和多个实例没有区别
综上所述:对象重用,不需要重复构造
解析:
一、构造函数私有化----避免重复构造
二、公开静态方法提供实例----这样才能提供外部访问
三、静态变量共享----保证全局变量的唯一性
思考:单线程与多线程的区别,考虑并发性
解决方案:加锁,但是要考虑性能优化(因为重复加锁会影响性能),加判断
优点
(1) 由于单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁时,而且创建或销毁时性能又无法优化,单例模式就非常明显了
(2) 由于单例模式只生成一个实例,所以,减少系统的性能开销,当一个对象产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
(3) 单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作
(4) 单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。
缺点
(1) 单例模式没有抽象层,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
(2) 单例类的职责过重,在一定程度上违背了“单一职责原则”。
(3) 滥用单例将带来一些负面问题,如:为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
又比如:在多个线程中操作单例类的成员时,但单例中并没有对该成员进行线程互斥处理。
#region 懒汉式
public static Singleton Instance = null;
private static readonly object _padLock = new object();
public static Singleton CreateInstance()
{
if (Instance == null)
{
lock (_padLock)//保证方法块儿只有一个线程可以进入
{
Console.WriteLine("进入lock排队....");
Thread.Sleep(1000);
if (Instance == null)
{
Instance = new Singleton();
}
}
}
return Instance;
}
#endregion
#region 饿汉式1
public static SingletonSecond Instance = null;
/// <summary>
/// 静态构造函数:由CLR保证,在第一次使用到这个类型之前,自动被调用且只调用一次
/// 很多初始化都可以写在这里
/// </summary>
static SingletonSecond()
{
Instance = new SingletonSecond();
}
public static SingletonSecond CreateInstance()
{
return Instance;
}
#endregion
#region饿汉式2
/// <summary>
/// 静态构造函数:由CLR保证,在第一次使用到这个类型之前,会自动初始化且只会初始化一次
private static SingletonThird Instance = new SingletonThird();
public static SingletonThird CreateInstance()
{
return Instance;
}
#endregion