单例模式(Singleton)
介绍
单例模式也就是保证一个类只有一个实例的一种实现方法罢了(设计模式其实就是帮助我们解决实际开发过程中的方法, 该方法是为了降低对象之间的耦合度)。
确保一个类只有一个实例(通过私有构造函数来保证类外部不能对类进行实例化),并提供一个全局访问点(通过创建一个返回该类对象的静态方法)。
单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况。
例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,自然在软件设计领域必须有这样的解决方案了(因为软件设计也是现实生活中的抽象),所以也就有了单例模式了。
单例模式结构图:
应用实例:
1、一个党只能有一个书记。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
扫描二维码关注公众号,回复:
2472901 查看本文章
实现:
namespace _04单例模式
{
/// <summary>
/// 客户端
/// </summary>
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1==s2 )//比较两次实例化后对象的结果是实例相同
{
Console.WriteLine("Objects are the same instance");
}
Console.Read();
}
}
class Singleton
{
private static Singleton instance;
//程序运行时创建一个静态只读的进程辅助对象
private static readonly object syncRoot = new object();
private Singleton()//构造方法让其private,堵死了外界利用new创建此类实例的可能
{
}
public static Singleton GetInstance()
{
if (instance ==null)//判断实例是否存在,不存在再加锁处理
{
lock (syncRoot )//在同一个时刻加了锁的那部分程序只有一个线程可以进入
{
if (instance ==null )
{
instance = new Singleton();
}
}
}
return instance;
}
}
}