C#设计模式应用-单件模式(Singleton Pattern)
C#设计模式应用-单件模式(Singleton Pattern)
一、什么是单件模式(Singleton Pattern) 单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法。 二、单件模式结构
//获取SQL连接字符串
string conn = SystemSettings.Default.SqlConnection; ...... SystemSettins.Default是单件实例,在整个生命周期只实例化一次。 //获取SQL连接字符串
string conn = new SystemSettins().SqlConnection; //每次创建新实例
●初始化静态成员时实例化对象 //单件模式实现方式1
public sealed class Singleton { //私有构造器,外部不能实例化这个类 private Singleton() { } //创建静态实例.初始化静态成员时实例化对象,速度最快! private static Singleton _Instance = new Singleton(); //单件模式实例 public static Singleton Instance { get { return _Instance; } } public void MyMothod() { Console.WriteLine("正在调用单件模式的方法!"); Console.ReadKey(); } }
//单件模式实现方式2
public sealed class SingletonII { //私有构造器,外部不能实例化这个类 private SingletonII() { } //声明静态变量 private static SingletonII _Instance = null; // //单件模式实例II,在使用时才创建实例。 //通常在占用内存超大的类才适用这种方法。 public static SingletonII Instance { get { //在使用时才创建单件实例,速度较第一种方式略慢,但基于现在xx86机器,速度问题直接忽略! if (_Instance == null) _Instance = new SingletonII(); return _Instance; } } public void MyMothod() { Console.WriteLine("正在调用单件模式II的方法!"); Console.ReadKey(); } }
//如果两个线程同时访问_Instance静态变量,此时if逻辑运算结果=True(因为_Instance还没有实例化).因此会创建两次实例。 //尽管发生的概率较低,先预防和了理原理是需要的。 if (_Instance == null) _Instance = new SingletonII();
//单件模式实现方式3,多线程访问情况下创建单件实例 public sealed class SingletonIII { //私有构造器,外部不能实例化这个类 private SingletonIII() { } //用于加锁的对象,是个临时对象,除了用于加锁无其它意义. private static readonly object _lock = new object(); //声明静态变量 private static SingletonIII _Instance = null; //单件模式实例III,多线程访问情况下处理 public static SingletonIII Instance { get { lock (_lock)//加锁,现在只能一个线程访问 { //在使用时才创建单件实例 if (_Instance == null) _Instance = new SingletonIII(); return _Instance; } } } public void MyMothod() { Console.WriteLine("正在调用单件模式III的方法!"); Console.ReadKey(); } } 关键的部分就是lock(_lock)方法,因为不管几个线程同时访问它,只能有一个线程进入并执行其中的代码,也就是去创建单件类的实例,当一个线程创建了单件类的实例后下一个线程再去判断if (_Instance == null)时,_Instance变量不再为null,所以也就不会有新的实例被创建了,这种写法网友称之为“双重检查”。 测试类,用于测试上面几种单件模式 public class Tester2 { //测试单件模式实现方式1- 初始化静态成员时实例化对象 public static void Test() { Singleton.Instance.MyMothod(); } //测试单件模式实现方式2-在使用时才创建实例 public static void Test1() { SingletonII.Instance.MyMothod(); } //测试单件模式实现方式3-多线程访问情况下创建单件实例 public static void Test2() { SingletonIII.Instance.MyMothod(); } } 测试: class Program { static void Main(string[] args) { Tester2.Test(); Tester2.Test1(); Tester2.Test2(); } } 扫一扫加微信
参考文档:
开发应用-职责链模式(Chain Of Resposibility Pattern) 开发应用-命令模式(C#实现POS收银功能) 开发应用-观察者模式之C#实现缓存数据更新 开发应用 - 策略模式(Strategy Pattern) 常用设计模式 C# 模拟VisualStudio窗体设计器拖放控件 设计模式 - 外观模式应用(Façade Pattern) C#.Net OOP系列之接口设计及策略应用实战 C# 使用设计模式构建通用数据库访问类 DevExpress XtraReport 开发指南 - 主从表报表设计(C#) C#委托(Delegate)事件(Event)应用详解 (原) C#设计模式-窗体基类模板方法定义 标签:C#.Net组件开发 - 自定义设计器持久化对象的属性 CS系统三层架构扩展支持WCF及策略模式应用(原创) C#.NET短信通用接口设计-调用短信API案例|C/S框架网 C#源码-基于C_S模式的书店销售管理系统源码-源码下载
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |