设计模式01_单例模式.pdf

设计模式01_单例模式.pdf

ID:52647119

大小:389.16 KB

页数:7页

时间:2020-03-29

设计模式01_单例模式.pdf_第1页
设计模式01_单例模式.pdf_第2页
设计模式01_单例模式.pdf_第3页
设计模式01_单例模式.pdf_第4页
设计模式01_单例模式.pdf_第5页
资源描述:

《设计模式01_单例模式.pdf》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、设计模式学习01—单例模式单例模式1、动机与定义系统中有些资源只能有一个,或者一个就够,多个浪费。例如一个系统只能有一个窗口管理器或文件系统、一个系统只能有一个计时器或序号生成器、web系统只能有一个页面计数器等等。此时,最好就需要把这些资源设置成有且仅有一个实例。代码中也就是如何保证一个类只有一个实例并且这个实例能够被访问呢?只有一个实例的就意味着不能让其他类来实例化,也就是只能自己实例化自己。能够被访问也就意味着自身要对外提供全局方法来获取到这个实例,这就是单例模式。单例模式定义:确保某一个类只有一个实

2、例,而且自行实例化并且向整个系统提供这个实例。单例模式通常代表着系统具有唯一性的资源。主要有3点:只有一个实例;自行创建这个实例;自行向整个系统提供这个实例。2、结构与类图单例模式是创建型模式,其实结构非常简单,需要注意以下3点:1、构造方法私有:不让外部实例化,只能将构造函数私有;2、提供一个公共静态方法获取实例:获取这个实例前是没有实例的,只能用静态的。3、实例保存到自身静态私有属性上:获取方法是静态的,实例当然也只能是静态的,最好是final的,单例不允许修改;通用类图如下:代码如下:1设计模式学习0

3、1—单例模式3、适用场景及效果(优缺点)1、只需要1个实例,多了浪费,主要用于节约系统资源,创建一个对象需要消耗过多资源时,考虑将这个对象缓存,设计成单例的,如创建某些程序启动配置对象读取、操作系统的文件系统等,只需要创建一个就够了,多了浪费;2、只需要1个实例,多了出错,如计数器,唯一序列号生成器等;3、单例意味着多线程使用(如果单线程使用,单例完全没有意义了),多线程下可以控制单一共享资源的访问和线程间通讯,避免对同一资源的多重占用,如仅有1个打印机,各个线程自行调用会对一个资源多重占用,单例模式可以统

4、一管理对打印机的访问,还有如数据库连接池、线程池、日志应用等。4、大量无状态的类实例,如需要大量静态常量或方法(有时也可以定义成static)可以考虑使用单例模式,如web开发中的service层,都是业务无状态的逻辑处理类,还有工具类和方法等,都可以设计成单例模式,这也是Spring框架中配置的bean默认都是单例的。优点(使用后的效果):1、单例只有一个实例,也只创建一次,可以节约系统资源,特别当这个对象需要频繁地创建和销毁时,而且创建和销毁要比较多的资源时;2、能避免对单一资源的多重占用,进行统一管理

5、。3、单例模式可以在系统设置全局访问点,优化和共享资源访问。缺点:1、没有接口,扩展困难,无法适应变化,基本上只能修改源码。(为什么没接口,就一个实例,接口没意义);2、测试麻烦,单例没完成,无法测试;3、与单一职责冲突。单例模式可以分为有状态的和无状态的,无状态的单例对象不可变的,一般就是提供一些工具方法,有状态的单例对象是可变的,常用来给系统当作状态库,提供一些状态,如序列号生成器等。2设计模式学习01—单例模式4、示例比如要做一个页面计数器,可以使用单例模式,非常简单,直接看代码:5、模式扩展说到单例

6、模式,很多人想到的是如何创建单例模式,有很多种创建方法,懒汉、恶汉、双重锁等等,此处大概介绍一下。第一种(饿汉)3设计模式学习01—单例模式第二种(饿汉变种)第三种(懒汉)4设计模式学习01—单例模式第四种(懒汉变种)第五种(双重锁定检查)5设计模式学习01—单例模式第六种(枚举)第七种(静态内部类)6设计模式学习01—单例模式单例模式创建方法有很多种,没有最好的,只有最合适的,比如第七种方法比较好,但是没必要为了一个不会出现的问题而使用很复杂的第七种模式,如果没有需要延迟加载的地方(如读取配置文件等),推

7、荐第一种模式,如果是JDK1.5以上,推荐使用枚举的方法。单例模式还有个地方要注意,只有1个实例,虽然构造函数私有化,外边不能new了,但是还有其他方式创建对象实例,如反序列化时,可能得到另一个实例,此时就要考虑序列化对单例的影响,还有不同类加载器(ClassLoader)对单例的影响等都要考虑。其实就是创建方式要支持的级别,这就需要根据实际情况,选择你的创建方式了:1、每次从getInstance()都能返回一个且唯一的一个对象。2、希望这个方法能适应多线程并发访问。3、并发时方法性能尽可能高。4、实现延

8、迟加载(LazyLoad),在需要的时候才被构造,而且要能够处理业务逻辑。5、能够处理多ClassLoader、多JVM,防止反序列化等情况。7

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。