《设计模式单例模式.pptx》由会员分享,可在线阅读,更多相关《设计模式单例模式.pptx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、大纲w单例模式概述w单例模式的结构与实现w单例模式的应用实例w饿汉式单例与懒汉式单例w单例模式的优缺点与适用环境第1页/共23页单例模式概述Windows任务管理器任务管理器在正常情况下只能打开唯一一个任务管理器!第2页/共23页单例模式概述如何保证一个类只有一个实例并且这个实例易于被访问?(1)全局变量:可以确保对象随时都可以被访问,但不能防止创建多个对象(2)让类自身负责创建和保存它的唯一实例,并保证不能创建其他实例,它还提供一个访问该实例的方法单例模式第3页/共23页单例模式概述单例模式的定义对象创建型模式单单例例模模式式:确保一个类只只有有一一个个实实例例,并提供一个全全局局访访问点问
2、点来访问这个唯一实例。Singleton Pattern:Ensure a class has only one instance,and provide a global point of access to it.Only one!Only one!第4页/共23页单例模式概述单例模式的定义要点:某个类只能有一个实例只能有一个实例必须自行创建这个实例自行创建这个实例必须自行向整个系统提供这个实例自行向整个系统提供这个实例第5页/共23页单例模式的结构与实现单例模式的结构第6页/共23页单例模式的结构与实现单例模式的结构单例模式只包含一个单例角色:Singleton(单例)第7页/共23页单
3、例模式的结构与实现单例模式的实现私有构造函数静态私有成员变量(自身类型)静态公有的工厂方法class Singleton private static Singleton instance=null;/静态私有成员静态私有成员变量变量 /私有构造函数私有构造函数 private Singleton()/静态公有工厂方法,返回唯一实例静态公有工厂方法,返回唯一实例 public static Singleton GetInstance()if(instance=null)instance=new Singleton();return instance;第8页/共23页单例模式的应用实例实例说明某
4、软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键,试使用单例模式设计服务器负载均衡器。第9页/共23页单例模式的应用实例实例类图服务器负载均衡器结构图第10页/共23页单例模式的应用实例实
5、例代码(1)LoadBalancer:负载均衡器类,充当单例角色(2)Program:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternSingletonSample)第11页/共23页单例模式的应用实例结果及分析第12页/共23页饿汉式单例与懒汉式单例饿汉式单例类饿汉式单例类(Eager Singleton)第13页/共23页饿汉式单例与懒汉式单例饿汉式单例类饿汉式单例类(Eager Singleton)class EagerSingleton private static EagerSingleton instance=new EagerSingleton();pri
6、vate EagerSingleton()public static EagerSingleton GetInstance()return instance;第14页/共23页饿汉式单例与懒汉式单例懒汉式单例类与双重检查锁定懒汉式单例类(Lazy Singleton)第15页/共23页饿汉式单例与懒汉式单例懒汉式单例类与双重检查锁定双重检查锁定class Singleton private static Singleton instance=null;private Singleton()public static Singleton GetInstance()if(instance=null
7、)instance=new Singleton();return instance;多个线程同时访问将导致创建多个单例对象!怎么办?第16页/共23页饿汉式单例与懒汉式单例懒汉式单例类与双重检查锁定双重检查锁定class LazySingleton private static LazySingleton instance=null;/程序运行时创建一个静态只读的辅助对象程序运行时创建一个静态只读的辅助对象private static readonly object syncRoot=new object();private LazySingleton()public static LazyS
8、ingleton GetInstance()/第一重判断,先判断实例是否存在,不存在再加锁处理第一重判断,先判断实例是否存在,不存在再加锁处理if(instance=null)/加锁的程序在某一时刻只允许一个线程访问加锁的程序在某一时刻只允许一个线程访问lock(syncRoot)/第二重判断第二重判断 if(instance=null)instance=new LazySingleton();/创建单例实例创建单例实例return instance;双重检查锁定第17页/共23页饿汉式单例与懒汉式单例饿汉式单例类与懒汉式单例类比较饿汉式单例类:无须考虑多个线程同时访问的问题;调用速度和反应时
9、间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长懒汉式单例类:实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响第18页/共23页单例模式的优缺点与适用环境模式优点提供了对唯一实例的受控访问可以节约系统资源,提高系统的性能允许可变数目的实例(多例类)第19页/共23页单例模式的优缺点与适用环境模式缺点扩展困难(缺少抽象层)单例类的职责过重由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失第20页/共23页单例模式的优缺点与适用环境模式适用环境系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例第21页/共23页ENDENDENDEND第22页/共23页感谢您的观看!第23页/共23页