文档章节

学习设计模式——单例模式

江左煤郎
 江左煤郎
发布于 2018/10/15 18:15
字数 889
阅读 12
收藏 0

1. 认识单例模式

    1. 定义:一个类中仅有一个实例,并提供一个访问它的全局访问点。

    2. 结构:仅一个Singleton类,其中包含一个static类变量,而类变量的类型就是Singleton类,而且Singleton类的构造方法必须声明为private,通过一个static修饰的getInstance方法使外界来访问这个类的唯一实例。

    3. 参考代码实现:有两种实现方式,一种是懒惰式(延迟加载),一种是饥饿式,懒惰式是以时间换取空间,而饥饿式是以空间换取时间

//饥饿式实现,以空间换时间,即在加载Singleton 类时就已经创建该类的单例对象
public class Singleton {
	//通过static来声明一个Singleton实例对象为类变量,只会创建一次
	private static Singleton s=new Singleton();
	//禁止通过构造方法生成Singleton的实例对象
	private Singleton(){	
	}
	
	public static Singleton getIntance(){
		return s;
	}
	//Singleton类中的其他方法操作
	public void SingletonOperation(){
		System.out.println("Singleton中的操作方法");
	}
	//Singleton类中可以有实例变量
	private int data;
}
//懒惰式单例模式,直到第一次调用getIntance()方法时才生成Singleton2的单例对象
public class Singleton2 {
	//通过static来声明一个Singleton实例对象为类变量,只会创建一次
	private static Singleton2 s=null;
	//禁止通过构造方法生成Singleton的实例对象
	private Singleton2(){	
	}
	public static Singleton2 getIntance(){
		if(s==null){
			s=new Singleton2();
		}
		return s;
	}
	//Singleton类中的其他方法操作
	public void SingletonOperation(){
		System.out.println("Singleton中的操作方法");
	}
	//Singleton类中可以有实例变量
	private int data;	
}

2. 理解单例模式

    1. 功能:保证单例类在运行期间只会被创建一个实例,并为该实例提供一个对外访问的方法。

    2. 范围:单例模式只会在同一个ClassLoader以及其子ClassLoader范围内有效。

    3. 多线程并发情况下的问题:在上面的参考代码中,懒惰式单例模式的实现如果是处于多线程并发情况下调用getInstance方法,就有可能会发生创建多个Singleton实例,也就是说会出现线程不安全现象,原因在于    s=new Singleton2()    该行代码处。所以为了保证线程安全,可以使用synchronized关键字来保证线程安全,但性能可能会不太好,推荐另一种实现方式

//懒惰式单例模式的保证线程安全的实现
public class Singleton3 {
	//通过该静态内部类,就可以实现延迟加载
	/*
	 * 由于该类是静态内部类,Singleton3Holder与Singleton3类并无依赖关系
	 * 也就是说,加载Singleton3类时不会自动加载Singleton3Holder,
	 * 只有调用Singleton3Holder内部的方法或变量时才会加载该类,而且加载只会加载一次,
	 * 所以这就相当于通过jvm的类加载机制来实现了延迟加载并保证了并发安全
	 */
	private static class Singleton3Holder{
		private static Singleton3 s=new Singleton3();
	}
	// 禁止通过构造方法生成Singleton的实例对象
	private Singleton3() {
	}

	public static Singleton3 getIntance() {
		return Singleton3Holder.s;
	}

	// Singleton类中的其他方法操作
	public void SingletonOperation() {
		System.out.println("Singleton中的操作方法");
	}

	// Singleton类中可以有实例变量
	private int data;
}

 

© 著作权归作者所有

共有 人打赏支持
江左煤郎
粉丝 26
博文 86
码字总数 220642
作品 0
西安
后端工程师
私信 提问
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
2018/08/27
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 舔狗是没有好下场的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听什么# #今天听这个# 分享 Nirvana 的歌曲《Smells Like Teen Spi...》 《Smells Like Teen Spi...》- Nirvana 手机党少...

小小编辑
今天
24
4
Linux Wireshark普通用户启动使用方案

当系统安装好Wireshark后请正常启动是否可以进行正常使用,如果不行请参考下列指导 向系统添加一个用户组 sudo groupadd wireshark //如提示此组存在可跳过 将指定用户添加到这个组中 sudo...

CHONGCHEN
今天
2
0
CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
2
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
5
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部