c# 单例模式


面向对象基础:抽象 封装 多态 继承
面向对象原则:封装变化 多用组合 少用继承 针对接口编程 依赖抽象 不依赖具体 尽量松耦合 对修改关闭 对扩展开放



单例模式简介

单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在,我们把这种实现方式称之为“单例模式”。


单例模式要点:
单例类只有一个实例存在
单例类提供一个全局访问点
单例类通过自己创建唯一实例
单例类对外所有访问对象都提供一个唯一实例。


单例模式优点:
在程序运行中只有一个实例,减少内存占用,减少频繁的创建和销毁实例所带来的系统开销,
避免资源的多种无效占用
单例模式缺点:
没有接口 不能继承
 

单例模式应用场景

当一个事物在特定的环境中,只会存在一个实例时,我们可以采用单例模式对其进行设计。
例: 数据库连接池,计算机注册表 一个国家只有一个总统 日志系统中的日志文件 计算机中的打印池 计算机设备管理器
生成唯一序列号 网站计数器


单例模式 实现方式


单例模式结构

 
using System;

// "定义一个单例类"
class SingleClass
{
  // 定一个静态私有单例类变量
  private static SingleClass instance;

  //定义一个私有的构造函数
  private SingleClass() {}

  //获取单例的构造方法
  public static SingleClass Instance()
  {
    //判断单例是否存在
    if(instance == null)
     {
      instance = new SingleClass();
     }
    return instance;
  }
}

/// 
/// 测试代码
/// 
public class Client
{
  public static void Main()
  {
    // Constructor is protected -- cannot use new
    SingleClass s1 = SingleClass.Instance();
    SingleClass s2 = SingleClass.Instance();

    if( s1 == s2 )
      Console.WriteLine( "相同实例" );
  }
}
 
  
  
  

/*最简单的单例模式-- 多线程会多莫名其妙的实例对象*/
public class SingleClass
{
    private static SingleClass _instance = null;
    private SingleClass(){}
    public static SingleClass CreateInstance()
    {
        if(_instance == null)
        {
            _instance = new SingleClass();
        }
        return _instance;
    }
}
 
/*线程安全 加入了线程锁 不会产生多个实例*/
public class SingleClass
{
    private volatile static SingleClass _instance = null;
    private static readonly object lockFlag = new object();
    private SingleClass(){}
    public static SingleClass CreateInstance()
    {
        if(_instance == null)
        {
            lock(lockFlag)
            {
                if(_instance == null)
                     _instance = new SingleClass();
            }
        }
        return _instance;
    }
}

 
/*
系统初始化时,自动生成一个实例
*/
public class SingleClass
{
    private SingleClass(){}
    public static readonly SingleClass instance = new Singleton();
}