C#设计模式-单例模式_第1页
C#设计模式-单例模式_第2页
C#设计模式-单例模式_第3页
C#设计模式-单例模式_第4页
C#设计模式-单例模式_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、www.ChinaSA.infoDesign Patterns单例模式单例模式www.ChinaSA.info大纲w 单例模式概述w 单例模式的结构与实现w 单例模式的应用实例w 饿汉式单例与懒汉式单例w 单例模式的优缺点与适用环境www.ChinaSA.info单例模式概述Windows任务管理器任务管理器在正常情况下只能打开在正常情况下只能打开唯一一个任务管理器!唯一一个任务管理器!www.ChinaSA.info单例模式概述w 如何保证一个类只有一个实例并且这个实例易于被访问?(1) 全局变量:全局变量:可以确保对象随可以确保对象随时都可以被访问,但时都可以被访问,但不能防止创不能防止创

2、建多个对象建多个对象(2) 让类自身负责创建和保存它让类自身负责创建和保存它的唯一实例,并保证不能创建其的唯一实例,并保证不能创建其他实例,它还提供一个访问该实他实例,它还提供一个访问该实例的方法例的方法单例模式单例模式www.ChinaSA.info单例模式概述w 单例模式的定义对象创建型对象创建型模式模式单例模式:单例模式:确保一个类只有一个实例只有一个实例,并提供一个全局访全局访问点问点来访问这个唯一实例。Singleton Pattern: Ensure a class has only one instance, and provide a global point of acces

3、s to it.www.ChinaSA.info单例模式概述w 单例模式的定义要点:要点: 某个类只能有一个实例只能有一个实例 必须自行创建这个实例自行创建这个实例 必须自行向整个系统提供这个实例自行向整个系统提供这个实例www.ChinaSA.info单例模式的结构与实现w 单例模式的结构instanceif(instance=null) instance=new Singleton();return instance;Singleton- instance : Singleton-+Singleton ()GetInstance ().: Singletonwww.ChinaSA.info

4、单例模式的结构与实现w 单例模式的结构单例模式只包含一个单例角色:单例模式只包含一个单例角色: Singleton(单例)www.ChinaSA.info单例模式的结构与实现w 单例模式的实现私有构造函数私有构造函数静态私有成员变量(自身类型)静态私有成员变量(自身类型)静态公有的工厂方法静态公有的工厂方法class Singleton private static Singleton instance=null; /静态私有成员静态私有成员变量变量 /私有构造函数私有构造函数 private Singleton() /静态公有工厂方法,返回唯一实例静态公有工厂方法,返回唯一实例 public

5、 static Singleton GetInstance() if(instance=null) instance=new Singleton(); return instance; www.ChinaSA.info单例模式的应用实例w 实例说明某软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和

6、请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键,试使用单例模式设计服务器负载均衡器。www.ChinaSA.info单例模式的应用实例w 实例类图LoadBalancer-instanceserverList: LoadBalancer: ArrayList = null = null-+LoadBalancer ()GetLoadBalancer ()AddServer (string server)RemoveServer (string server)GetServer ().: LoadBalancer : void: v

7、oid: string服务器负载均衡器结构图服务器负载均衡器结构图www.ChinaSA.info单例模式的应用实例w 实例代码 (1) LoadBalancer:负载均衡器类,充当单例角色:负载均衡器类,充当单例角色 (2) Program:客户端测试类:客户端测试类演示演示参考代码参考代码 (DesignPatternSingletonSample)www.ChinaSA.info单例模式的应用实例w 结果及分析www.ChinaSA.info饿汉式单例与懒汉式单例w 饿汉式单例类饿汉式单例类饿汉式单例类(Eager Singleton)instanceEagerSingleton- in

8、stance : EagerSingleton = new EagerSingleton()-+EagerSingleton ()GetInstance ().: EagerSingletonwww.ChinaSA.info饿汉式单例与懒汉式单例w 饿汉式单例类饿汉式单例类饿汉式单例类(Eager Singleton)class EagerSingleton private static EagerSingleton instance = new EagerSingleton(); private EagerSingleton() public static EagerSingleton Ge

9、tInstance() return instance; www.ChinaSA.info饿汉式单例与懒汉式单例w 懒汉式单例类与双重检查锁定懒汉式单例类懒汉式单例类(Lazy Singleton)instanceLazySingleton- instance : LazySingleton = null-+LazySingleton ()GetInstance ().: LazySingletonif ( instance = null ) instance = new LazySingleton();return instance;www.ChinaSA.info饿汉式单例与懒汉式单例w

10、懒汉式单例类与双重检查锁定双重检查锁定双重检查锁定class Singleton private static Singleton instance=null; private Singleton() public static Singleton GetInstance() if(instance=null) instance=new Singleton(); return instance; 多个线程同时访问将多个线程同时访问将导致创建多个单例对导致创建多个单例对象!怎么办?象!怎么办?www.ChinaSA.info饿汉式单例与懒汉式单例w 懒汉式单例类与双重检查锁定双重检查锁定双重检查

11、锁定class LazySingleton private static LazySingleton instance = null; /程序运行时创建一个静态只读的辅助对象程序运行时创建一个静态只读的辅助对象private static readonly object syncRoot = new object();private LazySingleton() public static LazySingleton GetInstance() /第一重判断,先判断实例是否存在,不存在再加锁处理第一重判断,先判断实例是否存在,不存在再加锁处理if (instance = null) /加锁的

12、程序在某一时刻只允许一个线程访问加锁的程序在某一时刻只允许一个线程访问lock(syncRoot) /第二重判断第二重判断 if(instance=null) instance = new LazySingleton(); /创建单例实例创建单例实例return instance; 双重检双重检查锁定查锁定www.ChinaSA.info饿汉式单例与懒汉式单例w 饿汉式单例类与懒汉式单例类比较饿汉式单例类:饿汉式单例类:无须考虑多个线程同时访问的问题;无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统

13、加载时间可能会比较长不及懒汉式单例;系统加载时间可能会比较长懒汉式单例类:懒汉式单例类:实现了延迟加载;必须处理好多个线实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响控制,将导致系统性能受到一定影响www.ChinaSA.info单例模式的优缺点与适用环境w 模式优点提供了提供了对唯一实例的受控访问对唯一实例的受控访问可以可以节约系统资源节约系统资源,提高系统的性能提高系统的性能允许可变数目的实例(允许可变数目的实例(多例类多例类)www.ChinaSA.info单例模式的优缺点与适用环境w 模式缺点扩展困难扩展困难(缺少抽象层)(缺少抽象层)单例类的单例类的职责过重职责过重由于自动垃圾回收机制,可能会导致共由于自动垃圾回收机制,可能会导致共享的单例对象的享的单例对象的状态丢失状

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论