一天一种设计模式之三-----单例模式
2019独角兽企业重金招聘Python工程师标准>>>
一.单例模式定义
确保一个类只有一个实例,而且自行实例化并向整个系统提供这一个实例。
主要优点:提供了对唯一实例的受控访问;由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。把构造方法都隐藏了,遵循了 迪米特法则;避免对共享资源的多重占用;可以全局访问。
由于单例模式中没有抽象层,因此单例类的扩展有很大的困难,违背依赖倒置原则;滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出,单例类的职责过重,在一定程度上违背了“单一职责原则”。
适用场景:需要频繁实例化然后销毁的对象;创建对象耗时过多或者消耗资源过多,但又经常用到的对象;有状态的工具类对象;频繁访问数据库或文件的对象。
注意事项:
只有单例类提供的方法得到单例对象,不要使用反射,否则会实例化一个新对象(也就是说通过反射是可以实例化多个单例类的),以前还听人说可以通过深拷贝,但clone方法默认是protect的,所以不用反射的话一样做不到;
不要做断开单例类对象与类中静态引用的危险操作(静态引用会存到java虚拟机的方法区,除非类文件被卸载,否则不会销毁,但一般类的卸载条件很严苛,所以连接静态引用的单例对象也会共存不会被gc收集);
多线程使用单例使用共享资源时,注意线程安全问题。
java中饿汉模式要好于懒汉模式,c++中则一般使用懒汉式单例。
有的单例可以被继承,比如登记式单例,可参考登记式单例模式。
单例可以有七种模式(笔者所知,不包括上述登记式单例模式):这七种模式可以参考之前转发的博文: 单例的七种表达方式
今天回家太晚了,没有把上面两篇博文整理在这里,抽空会整理的
二.测试代码
下面代码用反射实现创建多个单例,至于问什么输出了4次,有兴趣的同学可以看下虚拟机的类加载机制。各位晚安。
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {Class clazz=Class.forName(SingleTon.class.getName());Constructor constructor=clazz.getDeclaredConstructors()[0];constructor.setAccessible(true);constructor.newInstance(new Object[]{});constructor.newInstance(new Object[]{});constructor.newInstance(new Object[]{});} } class SingleTon{private static SingleTon singleTon=new SingleTon();private SingleTon(){System.out.println("chuangjian");}public static SingleTon getInstance(){return singleTon;} }
转载于:https://my.oschina.net/u/2323537/blog/632484
一天一种设计模式之三-----单例模式相关推荐
- java 23种设计模式 04 单例模式
java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. ...
- 24种设计模式之单例模式
24种设计模式之单例模式 一.核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 二.常见的应用场景: 1.Windows的Task Manager(任务管理器)就是很典型的单 ...
- Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...
- 23种设计模式之单例模式、工厂模式、原型模式、建造者模式
系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...
- Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解
源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...
- 一天一种设计模式之五-----代理模式
2019独角兽企业重金招聘Python工程师标准>>> 一.代理模式简介 代理模式属于结构型模式 定义:代理模式为其他对象提供一种代理以控制对这个对象的访问. 代理模式是java框架 ...
- 一天一种设计模式之二-----备忘录模式
2019独角兽企业重金招聘Python工程师标准>>> 一.备忘录模式 备忘录模式属于三种设计模式中的行为型模式(另外两种是创建型模式和结构型模式). 定义:在不破坏封闭性的前提下, ...
- java23种设计模式+单例_Java23种设计模式之单例模式
一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点: 1.单例类只能有一个实例: 2.单例类必须自己创建自己的唯一的实例: ...
- Java23种设计模式之单例模式
单例模式 前言 一.单例模式特点 二.单例模式的优点 三.单例模式的缺点 四.饿汉式单例模式 五.懒汉式单例模式 总结 前言 单例模式(Singleton Pattern)是 Java 中最简单的设计 ...
最新文章
- 计算机和网络历史地位,所谓“运营商的文字游戏”,其实是计算机和网络发展的客观历史导致的...
- python带我起飞 豆瓣评分_你听过后觉得爽到飞起的电音是哪一首?
- 如何打造规范的开源项目workflow
- android manifest简介
- Android秒级编译方案-FreeLine
- 混合app用百分比还是rem_如何用平板APP和手机APP控制混合音视频矩阵切换器
- 在Linux环境下使用Apache部署ASP.NET Core
- 【ArcGIS风暴】ArcGIS+CASS点云(.las)数据生成等高线方法案例精解
- BUAA_OO_第二单元
- 中国金融体系主要指标大全!
- java list初始容量_java中快速创建带初始值的List和Map实例
- larveral开发api源码 php_PHP数据库驱动扩展概述与不同方式连接数据库总结
- path和classpath的区别
- TP5 使用redis
- APPSCAN学习目录
- 如何c51和mdk共存兼容_解决KeilMDK和KeilC51的兼容性——如何只用一个keil软件既可编译51核又可编译ARM核...
- 计算机主板巨头,主板主要厂商
- Beta版本 为什么程序员总是分不清万圣节和圣诞节?因为 Oct 31 == Dec 25。
- 如何在eclipse配置服务器server (java ee)
- ModSecurity web application firewall (WAF) Research - .Little Hann
热门文章
- Django运行服务报NameError: name ‘os‘ is not defined-已解决
- php中mysql数据库集群,MySQL集群
- 《Java并发编程的艺术》第3章 Java内存模型
- matlab虚拟现实之V-Realm Builder2建模第二部分
- matlab左除怎么输入法,python 实现matlab左除
- 误差理论实际应用公式
- php 余额冻结设计_加密货币交易所:微服务架构设计
- ordfilt2非线性滤波器
- [Java]toString的用法
- 余承东宣布鸿蒙系统视频,余承东宣布鸿蒙系统开源:打造全球的操作系统