文档章节

单例模式-创建型模式4

凯文加内特
 凯文加内特
发布于 2013/12/03 15:12
字数 1198
阅读 39
收藏 0
点赞 0
评论 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)的思想,用的时候再加载,时间换空间。

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

© 著作权归作者所有

共有 人打赏支持
凯文加内特
粉丝 326
博文 665
码字总数 87615
作品 0
青岛
后端工程师
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

设计模式Java Design Pattern-工厂方法模式FactoryMethod

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

勇敢写信 ⋅ 03/22 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

设计模式梳理(一)

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

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

设计模式分类与原则

创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(...

晨猫 ⋅ 03/12 ⋅ 0

【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying ⋅ 今天 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

Java经典设计模式基础

一、概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理...

Idea ⋅ 01/20 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 20分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 24分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 29分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 30分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 41分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 今天 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 今天 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部