• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#单例模式的理解

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、单例模式的定义

  确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例,是一种对象创建型模式,有如下3个要点:

  • 只能有一个实例
  • 必须是自行创建这个实例
  • 必须自行向整个系统提供这个实例

二、单例模式的结构

  • 一个类型为自身的静态私有成员变量 - 存储唯一实例
  • 一个私有的构造函数
  • 一个公有的静态成员方法 ,返回唯一实例,对象为自身
 
 1  class SingletonClass
 2     {
 3         private static SingletonClass _instance = null;   //静态私有成员变量,存储唯一实例
 4 
 5         private SingletonClass()    //私有构造函数,保证唯一性
 6         { 
 7         }
 8 
 9         public static SingletonClass GetInstance()    //公有静态方法,返回一个唯一的实例
10         {
11             if (_instance == null)
12             {
13                 _instance = new SingletonClass();
14             }
15             return _instance;
16         }
17     }
 

三、单例模式的两种书写方法

1.类被加载时就将自己实例化

 1 class SingletonClass
 2     {
 3         private static SingletonClass _instance = new SingletonClass();
 4        
 5         private SingletonClass()
 6         { 
 7         }
 8 
 9         public static SingletonClass GetInstance()
10         {
11             return _instance;
12         }
13     }

 

2.类在第一次被引用时将自己实例化

 1 class SingletonClass
 2     {
 3         private static SingletonClass _instance = null;
 4         private static readonly object syncRoot = new object();   
 5 
 6         private SingletonClass()
 7         { 
 8         }
 9 
10         public static SingletonClass GetInstance()
11         {
12             if (_instance == null)
13             {
14                 lock (syncRoot)
15                 {
16                     if (_instance == null)
17                     {
18                         _instance = new SingletonClass();
19                     }
20                 }
21             }
22             return _instance;
23         }
24     }

四、双重锁的运用分析

   在上述代码中出现“If - Lock - If”结构模式,即双重检查锁定的双重判断机制:

 
 1             if (_instance == null)   //第一重判断,先判断实例是否存在,不存在再加锁处理
 2             {
 3                 lock (syncRoot)   //加锁,在某一时刻只允许一个线程访问
 4                 {
 5                     if (_instance == null)   //第二重判断: 第一个线程进入Lock中执行创建代码,第二个线程处于排队等待状态,当第二个线程进入Lock后并不知道实例已创建,将会继续创建新的实例
 6                     {
 7                         _instance = new SingletonClass();
 8                     }
 9                 }
10             }
 

 

五、单例模式的优缺点

  • 封装了唯一性,可严格控制客户怎么访问及何时访问
  • 内存中只存在一个对象,可节约系统资源,提高系统性能
  • 单例类的扩展不方便
  • 单例类既提供了业务方法,又提供了创建对象的方法,将对象的创建和对象本身的功能耦合在一起

六、适用环境

  系统只需要一个实例对象,客户调用类的单个实例只允许使用一个公共访问点,除了公共访问点,不能通过其他途径访问该实例

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[转]C# Invalidate()方法 用处发布时间:2022-07-14
下一篇:
C#文件读写常用类介绍发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap