单例模式——创建型模式01
1. 名称
单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式是一种对象创建型模式。
2. 问题
在有些时候,对于某个类,我们无需创建多个它的实例。站在资源利用的角度讲,单例能够节省系统资源;站在面向对象设计的角度讲,有些类确实只应该存在一个实例。例如,一个资源管理器类(比如Windows的资源管理器),它封装着系统的一些数据信息,它的作用就是封装这些数据信息,然后提供一些操作数据的方法,供调用者调用。我们是没有必要创建出多个它的实例的(还是以Windows的资源管理器为例,正常情况下你只能打开一个它的窗口)。
3. 解决方案
实现单例模式的方案有很多,下面给出几种常见的方案:
Java代码如下:
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
return instance == null ? new Singleton() : instance;
}
}
代码很简单,算是最基本单例模式。具有懒加载特点,即在getInstance方法调用时,才初始化instance,但其只能在单线程中达到单例效果,在多线程中可能会出现创建多个实例的问题。
Java代码如下:
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public synchronized static Singleton getInstance() {
return instance == null ? new Singleton() : instance;
}
}
由于(1)中给出的懒汉模式的getInstance方法没有同步,而达不到单例的目的,于是有了(2)中线程安全的懒汉模式。它与(1)的区别仅仅在getInstance()方法前加了synchronized关键字。但随之而来的是效率低的问题,事实上,在大部分情况下,getInstance方法是不需要同步。
Java代码如下:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public synchronized static Singleton getInstance() {
return instance;
}
}
这种方式利用了classLoder的特点,在类装载时就初始化instance,而在getInstance中直接返回instance,避免了多线程安全问题。缺点是,在类装载时就实例化对象,而不能进行懒加载。
除了上面的方法外,有时候,还用静态代码块来初始化instance,与上述方法类似。
public class Singleton {
private static Singleton instance;
static{
instance = new Singleton();
}
private Singleton() {
}
public synchronized static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private static class Holder {
private final static Singleton instance = new Singleton();
}
private Singleton() {
}
public synchronized static Singleton getInstance() {
return Holder.instance;
}
}
这种方式兼具了以上两种方式的优点,既能够懒加载(只有在调用getInstance方法时,系统才会装载Holder类,从而实例化Instance),又是线程安全的。
public enum Singleton {
INSTANCE;
}
利用枚举来达到单例的目的,见的比较少。
public class Singleton {
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
这种方法是对(2)中懒加载方式的改进。它不是将整个getInstance方法锁定,而是利用了同步代码块,缩小了同步范围,提高效率。之所以使用两层判断,原因如下:
使用第一个判断,可以避免大多数不需要同步的情况发生阻塞。如果没有该判断,与直接锁定方法无异;第二个判断是基本的判断,判断是否实例化。
单例模式——创建型模式01的更多相关文章
- [C#]设计模式-单例模式-创建型模式
单例模式用于在整个软件系统当中保持唯一实例,在 C# 当中最能够体现此概念的就是静态类,静态类的生命周期是跟随整个程序,并且在整个程序中仅保有一个实例. 不过在这里我们不再详细阐述单例模式与静态类有什 ...
- Sington单例模式(创建型模式)
一.使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性.以及良好的效率. 大多数类用的是常规的构造器,所以往往 ...
- 设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...
- 设计模式学习之单例模式(Singleton,创建型模式)(4)
假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...
- [19/04/22-星期一] GOF23_创建型模式(单例模式)
一.概念 <Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式>一书),由 Eri ...
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- Java设计模式 - 单例模式(创建型模式)
单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...
- Java设计模式——单例模式(创建型模式)
概述 单例模式保证对于每一个类加载器,一个类仅有一个实例并且提供全局的访问.其是一种对象创建型模式.对于单例模式主要适用以下几个场景: 系统只需要一个实例对象,如提供一个唯一的序列号生成器 客户调 ...
- Java设计模式之创建型模式
创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类
随机推荐
- SQLServer执行命令出现“目录无效的提示”
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...
- <译>通过PowerShell工具跨多台服务器执行SQL脚本
有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 .简单的几步搞 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- Atitit.软件研发团队建设原理与概论 理论
Atitit.软件研发团队建设原理与概论 理论 培训 团队文化建设(内刊,ppt,书籍,杂志等) 梯队建设 技术储备人才的问题 团队建设--小红花评比. 团队建设--文化墙.doc 户外拓展 1. 团 ...
- mysql 5.7中的用户权限分配相关解读!
这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...
- CSS笔记
初级篇===========================选择器============================元素选择器css:h1{color: red}html:<h1> ...