·核心作用:

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

·常见应用场景:

  -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. 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态

    最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...

  2. 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...

  3. Hibernatel框架关联映射

    Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...

  4. C# 条形码操作【源码下载】

    本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...

  5. mybatis_映射查询

    一.一对一映射查询: 第一种方式(手动映射):借助resultType属性,定义专门的pojo类作为输出类型,其中该po类中封装了查询结果集中所有的字段.此方法较为简单,企业中使用普遍. <!- ...

  6. 使用SecureCRT连接虚拟机(ubuntu)配置记录

    这种配置方法,可以非常方便的操作虚拟机里的Linux系统,且让VMware在后台运行,因为有时候我直接在虚拟机里操作会稍微卡顿,或者切换速度不理想,使用该方法亲测本机效果确实ok,特此记录. Secu ...

  7. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  8. 如何区别exists与not exists?

    1.exists:sql返回结果集为真:not exists:sql不返回结果集为真.详解过程如图: exists not exists

  9. MySQL 优化之 ICP (index condition pushdown:索引条件下推)

    ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...

  10. Linux的学习笔记

    Linux,1991年,系统安全,良好的可移植性,多用户,多任务,良好的兼容性,良好的用户界面, 主流的是RedHat或者CentOS, CentOS 设置的网关 192.168.2.2 Window ...