`
黑熊精
  • 浏览: 3154 次
社区版块
存档分类
最新评论

单例设计模式的七种方式

阅读更多
单例是一种设计模式,指该类被创建后有且仅有一个实例供外部访问,并且提供一个全局的访问入口。
有三个核心点:
1、类的构造方法私有化
2、内部产生该类的实例化对象,并声明为private static
3、定义一个静态方法返回该类的实例
常见的单例模式有下面几种。
一、饱汉方式
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton  getInstance(){
		if(singleton == null){
			singleton = new Singleton ();
		}
		return singleton;
	}
}
该方式不能算真正的单例模式,在多线程环境下根本无法实现单实例。
 
 
二、饱汉-线程安全
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
 
实现了线程的同步,但是synchronized 的粗暴导致该方式性能低下。
 
三、饿汉方式
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton (){}
public static Singleton getInstance(){
return singleton;
}
}
 
所谓饿汉即一开始就声明示例,是通过类加载的方式避免了多线程同步问题。在类初始化是实例化singleton。
 
四、饿汉-静态代码块
public class Singleton {
private static Singleton singleton;
private Singleton(){}
static{
singleton = new Singleton();
}
public static Singleton getInstance(){
return singleton;
}
}
 
在编码上跟饿汉方式有很大区别,但是实际区别不大,都是在类初始化时候实例化singleton。
 
五、静态内部类
public class Singleton {
private Singleton(){}
private static class SingletonHolder {
private static final Singleton singleton = new Singleton();
}
public static final Singleton getInstance(){
return SingletonHolder.singleton;
}
}
 
该方式也是利用classloader保证単实例,但是跟饿汉模式还是有很大区别的,饿汉是在类初始化时候已经实例化了singleton,但是静态内部类只有在真正调用getInstance()时候才会实例化singleton,故真正意义上实现了懒加载。
 
六、双重校验
public class Singleton {
private volatile  static Singleton singleton ;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
 
该方式是饿汉-线程安全方式的变种,且大大提高了性能。但是请注意写法使用了volatile  关键字,为什么?主要还是跟JVM的制令重排有关系,导致线程获取未完全初始化的实例。
singleton = new Singleton(); 的过程经历了三个步骤。
1、在堆中为Singleton开辟内存空间,分配地址。
2、执行构造函数初始化
3、将内存地址赋值给singleton 。
如果是经过了指令重排后,那么2、3步骤将交换。试想如果在执行完步骤3,还未开始执行2,另外的线程在执行到第一个if判断是,此时的singleton != null,那么将返回一个外完全初始化的singleton。
七、枚举方式
public enum Singleton {
	
	INSTANCE;
	
	private String toDO(){
		return "XXXX";
		
	}
}
关于枚举实现单例,这篇文章解释的很详细http://www.cnblogs.com/ldq2016/p/6627542.html。
就个人而言:
 第一种饱汉模式根本就不能算是单例,三、四基本是一样。五、六很经典。三、五是比较常用的。枚举模式好处还是多多的,就是平时用的很少而已。
 
 

 

分享到:
评论

相关推荐

    单例模式的多种实现.docx

    单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量...

    java设计模式——单例模式

    今天给大家带来的是23种设计模式的第一种——单例模式。前天写的第一篇文章设计模式的七大原则,是我第一次写文章,目前看了浏览量,让我信心大增。文章有什么讲述方式不对的欢迎大家随时给我私信。24小时恭候!!...

    尚硅谷设计模式源码笔记课件.zip

    本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,...

    24种设计模式介绍与6大设计原则

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    23种设计模式的C++实现.rar

    1、​​单例模式​​:这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象(单例类只能有一个实例) 2、​​原型模式​​:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和...

    设计模式Demo

    针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰...

    图解Java设计模式(一)

    本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,...

    全新150集通俗易懂的Java设计模式

    本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计...

    百度地图毕业设计源码-Design-Patterns:设计模式

    本章系Java之美[从菜鸟到高手演变]系列之设计模式,我们会以理论与实践相结合的方式来进行本章的学习,希望广大程序爱好者,学好设计模式,做一个优秀的软件工程师! 企业级项目实战(带源码)地址: 23种模式java实现...

    JAVA面试题收录

    文章目录一、JavaSE基础二、JavaWeb部分三、...单例设计模式 常见的异常类型 Throws和Throw的区别 Final,Finally,finalize关键字的作用 Hashtable与HashMap的区别 线程和进程的区别 实现多线程程序的2种方式 List、

    java简易投票系统源码下载-DesignModeDemo:23种设计模式swift实现

    一、设计模式七大原则(有些地方使用六大原则,没有第六调,此处主要是总结,用于学习) 1、单一职责原则 一个类只负责一个功能领域中的相应职责 2、里氏替换原则 任何基类可以出现的地方,子类一定可以出现 3、依赖...

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    还有就是从最基础的地方优化我们写代码减少不必要的资源浪费:不要频繁的new对 象,对于在整个应用中只需要存在一个实例的类使用单例模式.对于String的连接操作,使 用StringBuffer或者StringBuilder.对于utility类型...

    java面试题

    70. MVC设计模式 53 71. Hibernate 54 71.1. Hibernate 介绍 54 71.2. Hibernate 实现原理 55 71.3. Hibernate 优点 56 71.4. Hibernate 的缓存体系 56 71.4.1. 一级缓存: 56 71.4.2. 二级缓存: 56 71.4.3. 缓存...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    scala从入门到精通技术教学视频

    06.使用trait实现适配器设计模式 07.使用trait实现模板方法模式 08.使用trait实现职责链模式 09.trait的构造机制 10.trait继承class 11.案例_程序员类 第九章 包_样例类_样例对象 00,导学 01.包的简介和格式...

    Java核心技术II(第8版)

    第一章 流与文件 1.1 流 1.1.1 读入和写出字节 1.1.2 完整的流家族 1.1.3 组合流过滤器 1.2 文本输入与输出 1.2.1 如何写出文本输出 1.2.2 如何读入文本输入 ...12.10.3 以本地方法方式实现注册表访问函数

Global site tag (gtag.js) - Google Analytics