GOF23—单例模式(1)

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

常见的应用场景:

1.Windows的Task Manager(任务管理器)

2.windows的Recycle Bin(回收站)

3.项目中,读取配置文件的类,一般也只有一个对象,没有必要每次使用配置文件数据,每次new一个对象去读取。

4.网站的计数器,也是采用单例模式,这样可以实现同步

5.应用程序的日志应用,一般都采用单例模式进行实现,因为共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

6.数据库连接池的设计也是采用单例设计模式,因为数据库连接是一种数据库资源。

7.操作系统的文件系统,一个操作系统只能有一个文件系统。

8.Application也是单例的典型应用。

9.在Spring中,每个Bean默认是单例的,这样做的优点就是Spring容器可以管理。

10.在servlet,每个servlet也是单例。

11.在Spring MVC/Struts1框架中,控制器对象也是单例

单例模式的优点:

—由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过

在启动应用程序时直接产生一个单例对象,然后永久驻留内存的方式来解决。

—单例模式可以在系统设置全局的访问点,优化共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

常见的五种单例模式实现方式:

—主要:

   1.恶汉式(线程安全,调用效率高。但是不可以延时加载)

   2.懒汉式(线程安全,调用效率不高,但是可以延时加载)

—其他:

   3.双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)

     4.静态内部类式(线程安全,调用效率高,可以延时加载)

   5.枚举单例(线程安全,调用效率高,不能延时加载)

恶汉式详细例子:

这样做是立即加载,如果我们这个类不需要instance对象,并且instance对象new的过程时间过长,这样造成了资源浪费。

懒汉式单例模式的例子:

要点:lazy load(懒加载) 延迟加载,用到的时候才会去加载。

问题:资源利用率提高了,但是每一次调用getInstance()方法都要同步,并发效率低。

双重检测锁单例模式例子:

优点:提高了执行效率不用每次都同步,只有第一次才同步,创建之后不需要同步。

问题:由于编译器优化和JVM底层内部模型原因,偶尔会出问题,所以不建议使用。

静态内部类单例设计模式(本质也是一种懒加载)

示例如下:

要点:

—外部类没有static属性,所以不会像恶汉式那样立即加载对象。

—只有真正调用getInstance()才会加载内部类,加载类时,线程是安全的。instance是static final类型,保证了内存中只有一个这样的

实例存在,而且只被赋值一次,保证了线程的安全性。

—兼备了并发高效调用和延时加载的优势。

枚举单例模式例子:

优点:

—实现简单

—枚举本身就是单例模式,由JVM从根本上提供保障,避免通过反射和反序列化的漏洞。

缺点:

—无法延时加载

时间: 2024-10-26 04:21:23

GOF23—单例模式(1)的相关文章

GOF23—单例模式(2)

本文介绍单例模式(不包含枚举单例模式)漏洞问题以及如何防止漏洞 1.反射可以破解单例模式,例子如下: 此时,我们运行Client类,发现s1和s2是一个对象,但s3和s4是不同的对象. 那么如何防止这种现象的发生呢,我们在私有化的构造方法里添加异常抛出,这样在对象存在的时候,通过反射调用私有化的构造方法,就会发生异常. 2.通过反序列化的方式破解 -首先我们要让单例模式的类实现Serializable接口,这样才可以序列化.其次,用ObjectOuputStream将对象写入硬盘,在用Objec

java GOF23单例模式-饿汉式图

原文地址:https://blog.51cto.com/14437184/2439983

Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工作,以达到本地和Java的统一,但是就这点而言就相当的消耗资源,所以就Java程序员需要不断的去优化自己的代码.今天所研究的单例模式就是在这样的条件下产生的, 所谓单例模式,就是只有一个实例,在堆里面只有一个.假如我们的实例,就需要一个,但是会多次用到,这样的话就会出现很尴尬的问题. 比如: Win

【GOF23设计模式】单例模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_单例模式.应用场景.饿汉式.懒汉式 1.GOF23设计模式  2.单例模式  3.饿汉式  1 package com.test.singleton; 2 /** 3 * 测试饿汉式单例模式 4 */ 5 public class SingletonDemo01 { 6 7 //类初始化时,立即加载这个对象(没有延时加载的优势).加载类时,天然的是线程安全的! 8 private static SingletonDem

GOF23设计模式之单例模式

·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recycle Bin(回收站)也是很典型的单例应用.在整个系统运行过程中,回收站一直维护着仅有的一个实例 -项目中,读取配置文件的类,一般也只有一个对象.没有必要每次使用配置文件数据,每次new一个对象去读取 -网站的计数器,一般也是采用单例模式实现,否则难以同步 -应用程序的日志应用,一般都采用单例模式

【GOF23设计模式】--单例模式

核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景 windows的任务管理器 windows的回收站 项目中,读取配置文件的类 网站的计数器,否则难以同步 应用程序的日志应用,一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加 数据库连接池的设计一般也是采用单例,因为数据库连接是一种数据库资源 Servlet的Application内置对象 Servlet编程中每个servlet也是单例的 Spring中每个bean默认就是单

java GOF23涉及模式-单例模式-静态内部类实现和枚举实现

静态内部类实现单例模式 public class Design { //静态内部类实现的懒加载模式,只有在调用getInstance方法时才会加载静态类,并且因为类加载天然线程安全,保证了只有一个实例 private static class single{ private static Design d=new Design(); } private Design() { } public static Design getInstance() { return single.d; } } 枚

java GOF23设计模式-单例模式-枚举实现单例模式图(枚举是天然的单例)

原文地址:https://blog.51cto.com/14437184/2440002

[Android]GOF23种设计模式 & Android中的设计模式

GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对于扩展是开放的, 对于修改是封闭的. 3. 依赖倒转原则: A. 高层模块不应该依赖低层模块,两个都应该依赖抽象.B.抽象不应该依赖细节,细节应该依赖抽象.说白了,就是要针对接口编程,不要对实现编程. 4. 迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用.如