文档章节

单例模式-创建型模式4

凯文加内特
 凯文加内特
发布于 2013/12/03 15:12
字数 1198
阅读 40
收藏 0

单例模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在,比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。

定义:
保证一个类只有一个实例,并提供一个访问他的全局访问点。
代码:
饿汉式,空间换时间

/**
 * 类说明: 饿汉式单例实现的示例
 * Time: 2013-12-3 下午3:25:25 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */

public class Singleton {
	/**
	 * 定义一个变量来存储创建好的类实例,直接在这里创建类实例,只会创建一次
	 */
	private static Singleton uniqueInstance = new Singleton();

	/**
	 * 私有化构造方法,好在内部控制创建实例的数目
	 */
	private Singleton() {
		//
	}

	/**
	 * 定义一个方法来为客户端提供类实例
	 * @return 一个Singleton的实例
	 */
	public static Singleton getInstance() {
		//直接使用已经创建好的实例
		return uniqueInstance;
	}

	/**
	 * 示意方法,单例可以有自己的操作
	 */
	public void singletonOperation() {
		//功能处理
	}

	/**
	 * 示意属性,单例可以有自己的属性
	 */
	private String singletonData;

	/**
	 * 示意方法,让外部通过这些方法来访问属性的值
	 * @return 属性的值
	 */
	public String getSingletonData() {
		return singletonData;
	}
}

懒汉式: 时间换空间

懒汉式1,非线程安全

/**
 * 类说明: 懒汉式单例实现的示例,非线程安全
 * Time: 2013-12-3 下午3:30:43 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */

public class Singleton {
	//4:定义一个变量来存储创建好的类实例
	//5:因为这个变量要在静态方法中使用,所以需要加上static修饰
	private static Singleton instance = null;

	//1:私有化构造方法,好在内部控制创建实例的数目
	private Singleton() {
	}

	//2:定义一个方法来为客户端提供类实例
	//3:这个方法需要定义成类方法,也就是要加static
	public static Singleton getInstance() {
		//6:判断存储实例的变量是否有值
		if (instance == null) {
			//6.1:如果没有,就创建一个类实例,并把值赋值给存储类实例的变量
			instance = new Singleton();
		}
		//6.2:如果有值,那就直接使用
		return instance;
	}
}

懒汉式2,线程安全,双重检查加锁

/**
 * 类说明: 懒汉式单例实现的示例,线程安全的方式
 * Time: 2013-12-3 下午4:02:13 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */

public class Singleton {
	/**
	 * 对保存实例的变量添加volatile的修饰
	 */
	private volatile static Singleton instance = null;

	private Singleton() {

	}

	public static Singleton getInstance() {
		//先检查实例是否存在,如果不存在才进入下面的同步块
		if (instance == null) {
			//同步块,线程安全的创建实例
			synchronized (Singleton.class) {
				//再次检查实例是否存在,如果不存在才真的创建实例
				if (instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

懒汉式3,线程安全

/**
 * 类说明: 懒汉式单例实现的示例,线程安全的方式
 * Time: 2013-12-3 下午4:03:21 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */

public class Singleton {
	/**
	 * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,
	 * 而且只有被调用到才会装载,从而实现了延迟加载
	 */
	private static class SingletonHolder {
		/**
		 * 静态初始化器,由JVM来保证线程安全
		 */
		private static Singleton instance = new Singleton();
	}

	/**
	 * 私有化构造方法
	 */
	private Singleton() {
	}

	public static Singleton getInstance() {
		return SingletonHolder.instance;
	}
}

懒汉式4,线程安全

/**
 * 类说明: 懒汉式单例实现的示例,线程安全
 * Time: 2013-12-3 下午3:25:25 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class Singleton {
	/**
	 * 定义一个变量来存储创建好的类实例
	 */
	private static Singleton uniqueInstance = null;

	/**
	 * 私有化构造方法,好在内部控制创建实例的数目
	 */
	private Singleton() {
		//
	}

	/**
	 * 定义一个方法来为客户端提供类实例
	 * @return 一个Singleton的实例
	 */
	public static synchronized Singleton getInstance() {
		//判断存储实例的变量是否有值
		if (uniqueInstance == null) {
			//如果没有,就创建一个类实例,并把值赋值给存储类实例的变量
			uniqueInstance = new Singleton();
		}
		//如果有值,那就直接使用
		return uniqueInstance;
	}

	/**
	 * 示意方法,单例可以有自己的操作
	 */
	public void singletonOperation() {
		//功能处理
	}

	/**
	 * 示意属性,单例可以有自己的属性
	 */
	private String singletonData;

	/**
	 * 示意方法,让外部通过这些方法来访问属性的值
	 * @return 属性的值
	 */
	public String getSingletonData() {
		return singletonData;
	}
}

使用场景:
控制类的实例个数为一个。
体现了延迟加载(lazy load)的思想,用的时候再加载,时间换空间。

留给自己的问题:
平常选中饿汉式或者

© 著作权归作者所有

共有 人打赏支持
凯文加内特
粉丝 337
博文 674
码字总数 98608
作品 0
青岛
后端工程师
私信 提问
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端工程师的知识体系

Front-End Engineer 这词很好的体现了前端的特(ku)殊(bi)性。 下图是张克军绘制的前端工程师图解: 前端开发的核心是HTML + CSS + JavaScript。本质上它们构成一个MVC框架,即HTML作为信息模...

文文1
10分钟前
0
0
随行付微服务测试之性能测试

背景 传统性能测试更多的是以事务为核心,更多的是由单个或者多个事务构成业务场景进行压测。全链路压测指完全引入相关联的系统,尽量真实模拟线上硬件环境,更多的是以请求为核心,完全模拟...

马力-随行付
12分钟前
0
0
JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!

摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载,版权归原作者所有。...

Fundebug
13分钟前
0
0
hanlp在Python环境中的安装失败后的解决方法

Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用。有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的...

左手的倒影
35分钟前
1
0
【更新】Infragistics Ultimate UI for WPF v18.2(二):分类图

下载Infragistics Ultimate UI for WPF最新版本 Infragistics Ultimate UI for WPF是一款提供高速的网格和图表,轻松创建仿Office应用程序的WPF界面框架,从广度和深度两方面使得开发者在缩短...

电池盒
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部