单例设计模式
模式简介
所属设计模式:创建型设计模式。
单例模式是结构最简单的设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以确保一个系统中的一个类只有一个实例,而且该实例易于被外界访问,从而方便对实例个数进行控制,节约系统资源。
对于一个软件系统中的某些类来说,只有一个实例很重要。例如一个系统只能有一个窗口管理器或者文件系统一个系统只能有一个计时工具或者ID生成器等。
单例模式的三个要点:
- 某个类只能有一个实例
- 他必须自行创建这个实例。
- 它必须自行向整个系统提供这个实例。
单例模式类图:
代码实现
经典例子:
namespace Singleton.SingletonClassic
{
public class SingletonClassic
{
private static SingletonClassic _instance;
public SingletonClassic GetInstance
{
get
{
if (_instance == null)
{
_instance = new SingletonClassic();
}
return _instance;
}
}
/// <summary>
/// 一般来说,单例模式的构造函数为私有的
/// </summary>
private SingletonClassic()
{
}
}
}
饿汉式单例模式:
namespace Singleton.SingletonClassic
{
public class EagerSingleton
{
private static EagerSingleton _instance = new EagerSingleton();
public EagerSingleton GetInstance()
{
return _instance;
}
private EagerSingleton()
{
}
}
}
懒汉式单例模式:
namespace Singleton.SingletonClassic
{
public class LazySingleton
{
private static LazySingleton _instance;
public LazySingleton GetInstance
{
get
{
if (_instance == null)
{
_instance = new LazySingleton();
}
return _instance;
}
}
private LazySingleton()
{
}
}
}
懒汉式单例模式加双重检查锁定:
namespace Singleton.SingletonClassic
{
public class LazySingleton
{
private static LazySingleton _instance;
//程序运行时创建一个静态只读的辅助对象
private static readonly object syncRoot = new object();
public LazySingleton GetInstance
{
get
{
//第一重判断,先判断实力是否存在,不存在再加锁处理
if (_instance == null)
{
//加锁的程序在某一时刻只允许一个线程访问
lock (syncRoot)
{
//第二重判断
if (_instance == null)
{
_instance = new LazySingleton();
}
}
}
return _instance;
}
}
private LazySingleton()
{
}
}
}
对于原型管理器的实现:
using System.Collections.Generic;
using Prototype.Prototype.Example;
namespace Singleton.PortoManager
{
public class ProtoManager
{
#region 懒汉式单例模式构造
private static ProtoManager _instance;
public ProtoManager GetInstance
{
get
{
if (_instance == null)
{
_instance = new ProtoManager();
}
return _instance;
}
}
private ProtoManager()
{
}
#endregion
/// <summary>
/// 管理类的核心在于使用一个集合来存储所有的被管理类型
/// </summary>
private Dictionary<string, IPrototype> ProtoDic = new Dictionary<string, IPrototype>();
/// <summary>
/// 添加原型方法
/// </summary>
public IPrototype AddProto(string name, IPrototype prototype)
{
if (ProtoDic.ContainsKey(name))
{
ProtoDic[name] = prototype;
return prototype;
}
ProtoDic.Add(name, prototype);
return prototype;
}
/// <summary>
/// 查询原型方法
/// </summary>
public IPrototype FindProto(string name)
{
if (ProtoDic.ContainsKey(name))
{
return ProtoDic[name];
}
return null;
}
}
}
单例模式总结
单例模式的优点
- 单例模式提供了对唯一实例的受控访问,因为单例类封装了他唯一的实例,所以可以严格控制客户怎么访问他以及何时访问它。
- 由于内存中只存在一个对象,可以节约系统资源。
- 单例模式允许可变数目的实例,这样的单例称之为多例类。
单例模式的缺点
- 单例类没有抽象层,所以拓展比较困难。
- 单例类的职责过重,在一定程度上违背了单一职责原则。
转载:https://blog.csdn.net/BraveRunTo/article/details/117434035
查看评论