·核心作用:

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

·常见应用场景:

  -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. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  2. [转]利用URLConnection来发送POST和GET请求

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  3. 谈谈JS中的函数节流

    好吧,一直在秋招中,都没怎么写博客了...今天赶紧来补一补才行...我发现,在面试中,讲到函数节流好像可以加分,尽管这并不是特别高深的技术,下面就聊聊吧! ^_^ 备注:以下内容部分来自<Jav ...

  4. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  5. springmvc SSM shiro redis 后台框架 多数据源 代码生成器

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  6. iOS微信第三方登录实现

    iOS微信第三方登录实现   一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...

  7. SqlServer简单数据分页

    手边开发的后端项目一直以来都用的.NET MVC框架,访问数据库使用其自带的EF CodeFirst模式,写存储过程的能力都快退化了 闲来无事,自己写了条分页存储过程,网上类似的文章多的是,这里只列了 ...

  8. 【每日一linux命令2】命令执行顺序:

    二.命令顺序:     若在 shell 内置的命令/bin 以及/usr/bin 之下都出现了命令 pwd,那当我们执行该命令时,会执行哪 一个?答案是第一优先执行 shell 内置的命令,再执行路 ...

  9. win7,M​i​n​d​m​a​n​a​g​e​r​2​0​1​2使用模板时弹出Runtime error R6025解决方法

    Mindjet.MindManager2012.v10.0在应用个别模板时提示"参数错误",然后自动关闭. 解决办法: 如果是win7系统,可以进入C:\Users\(用户名)\A ...

  10. Alwayson的IP冲突

    Alwayson的IP冲突 https://social.technet.microsoft.com/Forums/office/en-US/4d50cb1c-eef7-4dcc-b937-3c8eb ...