Java设计模式(4)——创建型模式之单例模式(Singleton)
一、概述
弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科):
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
设计模式概念的介绍,参见:http://blog.jobbole.com/101076/
其中涉及的设计原则的概念,参见随笔:http://www.cnblogs.com/jiangbei/p/6910790.html
二、单例模式
单例模式:保证整个应用程序中某个类的实例有且只有一个(日志对象等)
常见的单例分为两种——饿汉式和懒汉式
1.饿汉式
通过静态属性:
创建Sinleton类,此类实例只能唯一
public class Singleton {
// 1.构造器私有化,保证不能通过外部创建实例
private Singleton() {
}
// 2.自己内部创建唯一实例
static Singleton instance = new Singleton();
}
因为是静态成员,所以可以通过类.的形式访问:
public class Demo01 {
public static void main(String[] args) {
// 静态方法创建两个对象
Singleton s1 = Singleton.instance;
Singleton s2 = Singleton.instance;
if (s1 == s2) {
System.out.println("s1、s2是同一个实例!");
} else {
System.out.println("s1、s2不是同一个实例!");
}
}
}

通过静态方法:
考虑到我们Java中非常重要的封装的概念,我们有必要对上述代码进行改进,让属性私有化,使得外部无法直接访问:
新的Singleton类:
public class Singleton {
// 1.构造器私有化,保证不能通过外部创建实例
private Singleton() {
}
// 2.创建私有唯一实例
private static Singleton instance = new Singleton();
// 3.对外创建公共的静态方法获取实例
public static Singleton getInstance() {
return instance;
}
}
测试类:
public static void main(String[] args) {
// 静态方法创建两个对象
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2) {
System.out.println("s1、s2是同一个实例!");
} else {
System.out.println("s1、s2不是同一个实例!");
}
}

以上就是饿汉式的单例模式,正如其名,饿汉饿汉,饿了就要吃饭,所以它早早的(静态,类加载的时候)就创建好了实例
创建完实例后以后不再改变,所以天生是线程安全的。
2.懒汉式
单例类Singleton2:
public class Singleton2 {
// 1.构造器私有化,不允许外部直接创建
private Singleton2() {
}
// 2.声明静态属性(而不实例化)
private static Singleton2 instance;
// 3.对外提供静态获取方法
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
测试类:
public static void main(String[] args) {
// 静态方法创建两个对象
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
if (s1 == s2) {
System.out.println("s1、s2是同一个实例!");
} else {
System.out.println("s1、s2不是同一个实例!");
}
}

懒汉式,也是和它的命名一样,懒得创建对象,初始化时只声明,第一次访问时才创建
当然,不得不指出,上述懒汉式是线程不安全的,多线程下是会存在创建多个实例的问题的,为此我们通过以下的改进方法来保证线程安全:
1.在getInstance()方法上加上同步(返回值前加):
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
2.双重检查double checking
补充;此种双重检查有待考察,实际中请使用饿汉式!
public static Singleton2 getInstance() {
if (instance == null) {
synchronized (Singleton2.class) {
if (instance == null) {
instance = new Singleton2();
}
}
}
return instance;
}
// 如果没有双重检查,少了任何一重,都会出现要么性能不高,要么创建多个实例
想了解更过有关单例的内容,请参见:http://blog.csdn.net/jason0539/article/details/23297037/
将单例模式中的静态变量(单例)推广到多个静态变量,工厂方法根据参数返回不同的变量,即引申为多例模式!这里不再展开多例模式,可以参阅《Java与模式》一书!
Java设计模式(4)——创建型模式之单例模式(Singleton)的更多相关文章
- Java设计模式_创建型模式_单例模式
单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图:
- Java设计模式之创建型模式
创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类
- Python版设计模式: 创建型模式:单例模式和工厂模式家族
一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- GoF的23种设计模式之创建型模式的特点和分类
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...
- Typescript玩转设计模式 之 创建型模式
作者简介 joey 蚂蚁金服·数据体验技术团队 前言 我们团队的工作是用单页面应用的方式实现web工具.涉及到数万到十数万行的前端代码的管理,而且项目周期长达数年. 怎么样很好地管理好这种量级的前端代 ...
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- 设计模式01 创建型模式 - 单例模式(Singleton Pattern)
参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...
- Java设计模式之职责型模式总结
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6548127.html 所谓职责型模式,就是采用各种模式来分配各个类的职责. 职责型模式包括 ...
随机推荐
- 取多个name值相同的input里面的值
html 中是允许多个具有相同name属性的元素的,例如服务器端读取的常规做法是: string name = Request.Params["txtName"]; 得到的将是一串 ...
- 20140316 曼联VS利物浦,罗杰斯的小九九,当4312对上4231
一.预测的阵式!? 赛前看fourfourtwo,Whoscored的首发预测,楼主立刻意淫了阵式图,并且大言不惭在微博贴了当晚的热战区域(上图的左侧),并疑惑着,格伦·囧森打左后卫,那这……显然是逼 ...
- SG函数&&SG定理
必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的 ...
- ListView实现分页加载(一)制作Demo
一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下: ...
- Ubuntu14.04.3,apt-get出现dpkg: error processing package xxx (--configure)和cups-daemon错误的解决方案
Ubuntu14.04.3,使用apt-get安装软件的时候,报个莫名其妙的错误: dpkg: error processing package xxx (--configure): balabala ...
- ZooKeeper介绍与环境搭建
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 数学归纳法·Fibonacci数列
数学归纳法 我们先来看一个例子: 我们让多诺米骨牌倒下的充要条件是: 第一块骨牌倒下: 假设当当前块骨牌倒下时,则他的后面一块也会倒下. 我们把这个例子给抽象出来就可以得到数学归纳法的证明过程: [第 ...
- tp3.2上一篇下一篇功能
1. 后台 //上一页 $map1['a_id'] = array('gt',$a_id); $map1['cate_id'] = array('eq',$cate_id); $front=$arc- ...
- Semi-Supervised Dimensionality Reduction
今天阅读了一篇关于半监督降维的论文,做个总结.这篇论文的全名叫<Semi-Supervised Dimensionality Reduction>(2006),是南大周志华老师的大作. 本 ...
- webAPI请求消息过滤器
每当制作一个WebAPI,就必然会收到外部很多调用这个API的请求,有时候,我们希望,能从这些外部来的请求中,按照一定条件筛选过滤一下,只将那些我们觉得合法的,有必要回应的请求放进来,一方面挡住那些非 ...