文档章节

设计模式 — 单例模式

j
 json_code
发布于 2017/06/13 15:33
字数 786
阅读 10
收藏 0

设计模式 — 单例模式

1.单例模式的定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2.单例模式的使用场景

确保某个类只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象那个只应该有且只有一个,例如,创建一个对象需要消耗的资源过多,如果访问IO和数据库等资源时,我们可以考虑单例模式。

3.实现单例模式的主要关键点

3.1.构造函数不对外开放,一般为private。

3.2.通过一个静态方法或者枚举返回单例类对象。

3.3.确保单例类的对象有且只有一个,尤其是在多线程下。

3.4.确保单例类对象在反序列化时不会重新构建对象。

通过单例类的构造函数私有化,使得客户端代码不能通过new的形式手动构造单例类的对象,单例类会暴露一个公有静态方法。客户端需要调用这个静态方法获取到单例类的唯一对象,在获取这个单例对象的过程中需要确保线程安全,也就是说在多线程环境下构造单例类的对象也是有且只有一个。

4.单例模式的简单示例

4.1.饿汉式单例

但是在getInstance之前,如果必须调用某个方法来给它设置参数,这样的情况下这种单例就无法使用。

4.2.懒汉式单例

懒汉模式是声明一个静态对象,并且在用户第一次调用getSingle时进行初始化。

4.3.双重锁实现单例

双重锁实现单例模式的优点技能在需要时初始化单例又能够保证线程安全,且单例对象初始化后调用getSingle不能进行同步锁。

第一层主要是为了避免不必要的同步,第二层判断是为了在null情况下创建实例。双重锁的优点,资源利用率高,第一次执行getSingle是单例才会

4.4.静态内部类实现单例

当第一次加载Single类时并不会初始化single,只有在第一次调用Single的getSingle方法时才会导致single被初始化,因此第一次调用getSingle方法会导致虚拟机加载SingleHolder类,这种方式不仅能够确保线程安全也能够保证单例对象的唯一性,同时也延迟了单例的实例化。

4.5.枚举单实例

枚举在Java中与普通类时一样的,不仅能够有字段,还能够有自己的方法,最重要的是默认枚举实例的创建是线程安全的,并且在任何情况下他都是一个单例。

4.6.推荐使用

推荐使用双重检查锁单例,和静态内部类单例。请勿转载,携手千锋php。

本文转载自:

j
粉丝 0
博文 56
码字总数 908
作品 0
呼和浩特
私信 提问
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针操作文件 柔性数组使用

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct _info* pInfo;struct _info{int line;int len;char data[0];}info;int getFil......

小张525
49分钟前
2
0
中介者模式

https://blog.csdn.net/jason0539/article/details/45216585

南桥北木
49分钟前
1
0
抽离css以及公共js

分离css 分离css:为何要把 CSS 文件分离出来,而不是直接一起打包在 JS 中。最主要的原因是我们希望更好地利用缓存。 extract-text-webpack-plugin > 1. 假设我们原本页面的静态资源都打包成...

莫西摩西
今天
2
0
Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用

Jenkins的配置从节点中默认没有Launch agent via Java Web Start,如下图所示,而这种启动方式在Windows上是最方便的。 如何设置才能让出来呢? 1:打开"系统管理"——"Configure Global Sec...

shzwork
今天
2
0
BAT面试必问HashMap源码分析

HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈...

别打我会飞
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部