·核心作用:

  -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

·常见应用场景:

  -Windows的Task Manager(任务管理器)就是很典型的单例模式

  -Windows的Recycle Bin(回收站)也是很典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例

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

  -网站的计数器,一般也是采用单例模式实现,否则难以同步

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

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

  -操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统

  -Application也是单例的典型应用(Servlet编程中会涉及到)

  -在servlet编程中,每个servlet也是单例

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

  -在SpringMVC框架中,控制对象(Controller)也是单例

·单例模式的优点:

  -由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一 个单例对象,然后永久驻留在内存中的方式来解决

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

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

  -主要:

    饿汉式(线程安全,调用效率高。但是,不能延时加载)

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

  -其他:

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

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

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

/**
* 饿汉式单例模式实现
* 问题:如果只是加载本类,而不是要调用getInstance(),甚至永远没有调用,则会造成资源的浪费
* @author XuZeSen
*
*/
public class SingletonDemo1 {
//类初始化时,立即加载这个对象(没有延时加载的优势),静态变量加载是天然的线程安全
private static SingletonDemo1 instance = new SingletonDemo1();
//构造器私有化
private SingletonDemo1() {
}
//定义一个全局的访问点,访问这个单例对象,方法没有同步,调用效率高
public static SingletonDemo1 getInstance(){
return instance;
}
}

  

 

/**
* 懒汉式单例模式实现
* 问题:资源利用率高了,但是,每次调用getInstance()方法都要同步,并发效率较低
* @author XuZeSen
*
*/
public class SingletonDemo2 {
//类初始化时,没有立即加载这个对象(延时加载,真正用到的时候再创建)
private static SingletonDemo2 instance;
//构造器私有化
private SingletonDemo2() {
}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if(null == instance){
instance = new SingletonDemo2();
}
return instance;
}
}

  

/**
* 双重检测锁实现
* 这个模式下将内容同步到if内部,提高了执行的效率,不必每次获取对象时都进行同步
* 只有第一次同步创建了
* @author Sen
*
*/
public class SingletonDemo3 {
private static SingletonDemo3 instance = null;
private SingletonDemo3() {
}
public static SingletonDemo3 getInstance(){
if(null == instance){
SingletonDemo3 temp;
synchronized (SingletonDemo3.class) {
temp = instance;
if(null == temp){
synchronized (SingletonDemo3.class) {
temp = new SingletonDemo3();
}
}
instance = temp;
}
}
return instance;
}
}

  

/**
* 静态内部类单例模式实现
* 外部类没有static属性,则不会像饿汉式那样立即加载对象
* 兼备了并发高效调用和延时加载的优势
* @author XuZeSen
*
*/
public class SingletonDemo4 {
//构造器私有化
private SingletonDemo4() {
}
//instance是static final类型,保证了内存中只有一个这样的实例存在,而且只能被赋值一次,从而保证了线程安全性
private static class SingletonClassInatance{
private static final SingletonDemo4 instance = new SingletonDemo4();
}
//只有真正调用getInstance(),才会加载静态内部类。加载类时是线程安全的。
public static SingletonDemo4 getInstance(){
return SingletonClassInatance.instance;
}
}

  

 

/**
* 枚举式单例模式实现(没有延时加载)
* @author XuZeSen
*
*/
public enum SingletonDemo5 { //这个枚举元素,本身就是单例对象
INSTANCE; //添加自己需要的操作!
public void singletonOperation(){ }
}

  

GOF23设计模式之单例模式的更多相关文章

  1. 【GOF23设计模式】单例模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_单例模式.应用场景.饿汉式.懒汉式 1.GOF23设计模式  2.单例模式  3.饿汉式  1 package com.t ...

  2. GOF23设计模式之单例模式(singleton)

    一.单例模式概述 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 由于单例模式只生成一个实例,减少了系统性能开销.所以当一个对象的产生需要比较多的资源时,如读取配置.产生其他依赖对象时, ...

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

    核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景 windows的任务管理器 windows的回收站 项目中,读取配置文件的类 网站的计数器,否则难以同步 应用程序 ...

  4. 【GOF23设计模式】原型模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 package com.test.prot ...

  5. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  6. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  8. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

  9. 设计模式之单例模式的简单demo

    /* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...

随机推荐

  1. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  2. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  3. 【Net跨平台第一步】逆天带你零基础Linux入门【更新完毕】

    部分讲义:(视频已删,后期以文档形式发布)

  4. InstallShield 脚本语言学习笔记

    InstallShield脚本语言是类似C语言,利用InstallShield的向导或模板都可以生成基本的脚本程序框架,可以在此基础上按自己的意愿进行修改和添加.     一.基本语法规则      ...

  5. ASP.NET Core project.json imports 是什么意思?

    示例代码: "frameworks": { "netcoreapp1.0.0": { "imports" : "portable- ...

  6. ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑

    原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...

  7. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  8. 听H3絮叨:何以让天下没有难用的流程

    最近朋友圈.网站新闻铺天盖地是"让天下没有难用的流程",有人就要问了,H3 BPM何德何能,为BPM站台,让天下没有难用的流程? 这是一个关于"办公室空想"的故 ...

  9. Android—ListView条目背景为图片时,条目间距问题解决

    ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图:

  10. 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览

    条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上)     实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...