单例模式:确保一个类只有一个实例,并提供一个全局访问点。
用到的设计原则:
1、封装变化
2、组合优于集成
3、针对接口变成而不是针对实现
4、为交互对象之间的松耦合设计而努力
5、类应该对扩展开放,对修改关闭
6、依赖抽象,而不是依赖具体类

最简单的单例

class Singleton {
private static Singleton instantce; private Singleton() {} public static Singleton getInstantce() {
if (instantce == null) {
instantce = new Singleton();
} return instantce;
}
}

但是这样在多线程的情况下就会出问题。当两个线程同时第一次获取单例时,此时instantce还是空,会返回两个实例。

处理多线程单例,最简单的多线程单例

class Singleton {
private static Singleton instantce; private Singleton() {} public static synchronized Singleton getInstantce() {
if (instantce == null) {
instantce = new Singleton();
} return instantce;
}
}

只是多加了一个synchronized关键字。但是这样,同步性能会降低。以后每次调用加保护都是一种累赘。但是如果应用程序可以接受这种额外负担,比如实际上调用这个方法的次数非常少,那就什么也别做,这个并不会影响多少性能。但是如果频繁的使用,可以使用下面的方法。

class Singleton {
private static Singleton instantce = new Singleton(); private Singleton() {} public static synchronized Singleton getInstantce() {
return instantce;
}
}

这样JVM在加载这个类的时候就已经创建出来唯一的单例。

或者利用双重检索的方法

class Singleton {
private static volatile Singleton instantce; private Singleton() {} public static synchronized Singleton getInstantce() {
if (instantce == null) {
synchronized (Singleton.class) {
if (instantce == null) {
instantce = new Singleton();
}
}
}
return instantce;
}
}

这里为什么里面还加了一个判断,和volatile这个关键字有关,volitile可以保证一个变量在多个线程间可见性,如果两个线程同时获取一个单例,这时单例为空,第一个线程先判断,锁住Singleton,第二个线程在等待,等待的地方是判断完为空的位置,第一个线程创建完获取到了,这时已经不为空了,如果这个地方不判断还会是在创建一个,由于volitale保证变量的可见性,第二个线程感知到已经实例化完了,就不去创建,直接获取已经创建好的实例就走了。还有双重锁定的方法不能用在jdk1.2之前,现在都1.8了,一般应该不会接触到这个问题。

还要注意一个问题,就是不同的类加载器加载这个类的时候还是会创建出不同的实例。如果程序中有多个类加载器,小心这个问题,解决的办法是自行指定类加载器。

OO设计认为类应该只做一件事,这里单例类不仅负责管理自己的实例,还在应用程序之间充当角色。尽管如此,由类管理自己的实例的做法还是很常见的,这可以让整体设计更简单,不然还需要设计一个类来管理这个单例类,实在有点繁琐。

Head First 设计模式 --5 单例模式的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  7. 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则

    加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...

  8. java 23 - 2 设计模式之单例模式

    单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢?  A:把构造方法私有  B:在成员位置自己创建一个对象  C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...

  9. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  10. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

随机推荐

  1. web前端开发工程师,你了解吗?

    web前端开发工程师可以说是一个全新的职业,在IT整个行业中真正受到重视的时间没有超过5年,也正因为这样,大家越来越想了解web前端工程师的前景究竟怎么样?web前端培训就业前景如何?web前端工程师 ...

  2. 循环调用MAIN

    --单位转移录入declare oi_errcode integer; oc_errtext varchar2(100);begin for p in (select * from ssunitinf ...

  3. js验证手机号输入是否符合规则

    function isPhone(phone){ var myreg = /^(((13[0-9]{1})|15[0-9]{1}|17[0-9]{1}|185|18[0-9]{1})+\d{8})$/ ...

  4. 学习 Linux,101: 使用基本 SQL 命令

    概述 在本教程中,将学习结构化查询语言 (SQL),包括: 使用基本 SQL 命令 执行基本数据操作 本教程将简要介绍您需要知道的与 LPI 102 考试相关的 SQL 概念.   回页首 数据库和 ...

  5. IO/ACM中来自浮点数的陷阱(收集向)

    OI/ACM中经常要用到小数来解决问题(概率.计算几何等),但是小数在计算机中的存储方式是浮点数而不是我们在作数学运算中的数,有精度的限制. 以下以GUN C++为准,其他语言(或编译器)也差不了多少 ...

  6. 关于在archlinux中安装virtualbox

    之前安装的时候具体忘记了,现在重新整理一下安装的过程: 1. 安装virtualbox sudo pacman -S virtualbox 安装的过程中因依赖,需要安装提供host模块的包,这里我们安 ...

  7. POJ - 1666 Candy Sharing Game

    这道题只要英语单词都认得,阅读没有问题,就做得出来. POJ - 1666 Candy Sharing Game Time Limit: 1000MS Memory Limit: 10000KB 64 ...

  8. 编译openssl

    windows: 下载openssl-1.0.1h.tar.gz文件 32位: 在解压的包中,有INSTALL.W32文件,按照文件提示安装 64位: 在解压的包中,有INSTALL.W64文件,按照 ...

  9. Dynamics AX 2012 R2 报表部署权限错误

    今天,Reinhard在 Deploy AX Reporting时,发生权限错误. 配置 ID: HOSTMSSQLSERVER 描述: HOST@MSSQLSERVER 默认值: True 报表服务 ...

  10. Android LayoutParams简介

    LayoutParams是子控件控制自己在父控件中布局的一个类. 不同布局都有相对的LayoutParams,最简单的LinearLayout.LayoutParams类可以设置布局的宽高. 我在写一 ...