单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》

package com.doctor.java.design_pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》
 * 
 * @author doctor
 *
 * @time 2015年4月24日 下午11:11:03
 */
public class SingletonPattern {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LazySingleton.getInstance();
		LazySingleton.getInstance();
		LazySingleton.getInstance();
		//
		EagerSingleton.getInstance();
		EagerSingleton.getInstance();

		//
		DoubleCheckLazySingleton.getInstance();
		DoubleCheckLazySingleton.getInstance();
		DoubleCheckLazySingleton.getInstance();

		//
		Singleton.getInstance();
		Singleton.getInstance();

		//
		EnumSingleton.instance.EnumSingletonOperation();
		EnumSingleton.instance.EnumSingletonOperation();

	}

	/**
	 * 懒汉式单例,线程安全
	 */
	public static class LazySingleton {
		private static final Logger log = LoggerFactory.getLogger(LazySingleton.class);
		// 私有静态对象,加载时候不做初始化
		private static LazySingleton singleton = null;

		// 私有构造方法,避免外部创建实例
		private LazySingleton() {
			log.info(LazySingleton.class.getName() + "单例 构造函数调用");
		}

		/**
		 * 静态工厂方法,返回此类的唯一实例 当发现实例没有初始化的时候,才初始化
		 * 
		 * @return
		 */
		public static synchronized LazySingleton getInstance() {
			if (singleton == null) {
				singleton = new LazySingleton();
			}
			return singleton;
		}
	}

	/**
	 * 懒汉式单例,线程安全,双重加锁提高访问速度
	 */
	public static class DoubleCheckLazySingleton {
		private static final Logger log = LoggerFactory.getLogger(DoubleCheckLazySingleton.class);
		// 私有静态对象,加载时候不做初始化
		private static DoubleCheckLazySingleton singleton = null;

		// 私有构造方法,避免外部创建实例
		private DoubleCheckLazySingleton() {
			log.info(DoubleCheckLazySingleton.class.getName() + "单例 构造函数调用");
		}

		/**
		 * 静态工厂方法,返回此类的唯一实例 当发现实例没有初始化的时候,才初始化
		 * 
		 * @return
		 */
		public static DoubleCheckLazySingleton getInstance() {
			if (singleton == null) {
				synchronized (DoubleCheckLazySingleton.class) {
					if (singleton == null) {
						singleton = new DoubleCheckLazySingleton();
					}
				}
			}
			return singleton;
		}
	}

	/**
	 * 饿汉式单例
	 */
	private static class EagerSingleton {
		private static final Logger log = LoggerFactory.getLogger(EagerSingleton.class);

		private static final EagerSingleton instance = new EagerSingleton();

		private EagerSingleton() {
			log.info(EagerSingleton.class.getName() + "单例 构造函数调用");

		}

		public static EagerSingleton getInstance() {
			return instance;
		}
	}

	/**
	 * 延迟加载+线程安全=内部类+静态初始化多线程默认同步锁
	 */

	public static class Singleton {
		private static final Logger log = LoggerFactory.getLogger(Singleton.class);

		private Singleton() {
			log.info(Singleton.class.getName() + "单例 构造函数调用");
		}

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

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

	/**
	 * 枚举实现单实例控制,提供序列化,且由jvm保证安全
	 */

	public static enum EnumSingleton {
		// 定义一个枚举元素,它只代表了EnumSingleton的一个实例。
		instance;
		/**
		 * 实例方法,单例可以有自己的操作
		 */
		public void EnumSingletonOperation() {
			// 功能处理
		}
	}
}
时间: 2024-12-15 08:48:03

单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》的相关文章

架构中的设计原则之接口分离原则(ISP) - 《java开发技术-在架构中体验设计模式和算法之美》

接口分离原则 接口分离原则的核心思想是:不应该强迫客户程序依赖它们不需要使用的方法.英文缩写ISP,即Interface Segregation Principle.其实接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该 把所有的操作都封装到一个接口中. 这里的"接口"指的不仅仅是通过interface关键字定义的接口,接口分为如下两种. 对象接口.java中声明的一个类,通过new关键字产生的一个实例,它是对一个类型的事物的描述,这也是一种

《修炼Java开发技术 在架构中体验设计模式和算法之美》 - 书摘精要

(P7) 建议直接加入到软件公司中去,这样会学到很多实际的东西: 程序员最主要的发展方向是资深技术专家,无论是 Java..Net 还是数据库领域,都要首先成为专家,然后才可能继续发展为架构师: 增强工作的主动性和参与性: 只有拥有更高的眼界,才能谋取更大的发展: (P10) 跳槽是需要本钱的,这个本钱就是你积累的工作经验.工作业绩.技术水平和工作能力: (P11) 一个好的领域专家一定是业务领域的架构师,他能够给出某一个业务领域的架构,我们可以称为业务架构,只有技术架构和业务架构紧密结合,才有

架构中的设计原则之开闭原则(OCP) - 《java开发技术-在架构中体验设计模式和算法之美》

开闭原则OCP(Open for Extension,Closed for Modification).开闭原则的核心思想是:一个对象对扩张开放,对修改关闭. 其实开闭原则的意思就是:对类的改动是通过增加代码进行的,而不是改动现有的代码.也就是说,软件开发人员一旦写出了可以运行的代码,就不应该去改变它,而是要保证它能一直运行下去,如何才能做到这一点呢?这就需要借助于抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定,而具体的实现层是可以改变和扩展的. 根据开闭原则,我们改变一个软

2019年入行IT学什么技术好?学java开发技术好不好

2019年入行IT学什么技术好?自IT行业超越金融行业,成为平均薪资收入高的行业,对IT行业产生向往之情的朋友是越发的多,很多朋友都在考虑学一门IT技术,但是苦恼比较多,学IT学什么技术好呢?现在火爆的IT技术还挺多的,从中挑一门IT技术学对于很多朋友来说是个难题. 2019年入行IT学什么技术好?学java开发技术好不好创一个小群,供大家学习交流聊天如果有对学java方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学java能够持之以恒java爱好群,如

2020 年最流行的 Java 开发技术

不知不觉间,2020 年即将于十几天之后到来,作为技术圈中你,准备好迎接最新的变化了吗?在本文中,我们将以编程界最常用的编程语言 Java 为例,分享最为主流的技术与工具. 作者 | divyesh.aegis 译者 | 弯月,责编 | 屠敏 以下为译文: Java几乎无处不在,无论在智能手机.台式机.游戏设备还是科学超级计算机上,处处都有Java的影子.全世界有数百万的Java程序员在开发基于Java的产品. 然而,如此激烈的竞争,意味着Java开发人员必须时刻保持领先地位. 为此,他们必须随

Java开发技术总结:异常

很多人学习Java,为了追求快速上手工作,还没学好Java技术基础,就开始着手框架的学习,殊不知本末倒置会让自己的未来堪忧! 对于Java技术学习,重点还是要放在基础知识上面,今天给大家分享的Java基础技术知识总结是:异常! 程序中出现的不正常的情况我们称之为"异常".在运行时出现了不正常的情况,程序将它进行了属性和行为(异常的位置.原因.名字等)的抽象,提取,终究形成了对象,继而形成各种异常类. 一.异常的分类 1.Error,错误.对应的是程序运行过程中出现的严重的问题,这里我们

学习Java开发技术的最佳书籍有哪些?

为了协助对java编程感兴趣的同学更好.更快的进步编程技能,小编在此引荐几本学习编程十分有用的书本,以供我们参阅. 入类别 1.<java从入门到通晓>(第3版) [内容介绍] 本书从初学者视点出发,经过通俗易懂的言语.五光十色的实例,具体介绍了运用Java言语进行程序开发应该把握的各方面技能.全书共分28章,包含:初识Java,了解Eclipse开发东西,Java 言语根底,流程操控,字符串,数组,类和目标,包装类,数字处理类,接口.继承与多态,类的高档特性,反常处理,Swing程序规划,调

Java开发技术栈:Java基础语法(一)标识符与关键字

Java标识符 定义 给包,类,方法,变量起名字的符号. 组成规则 标识符由字母.数字.下划线.美元符号组成. 命名原则:见名知意 包名:全部小写,多级包用.隔开. 举例:com.jourwon 类.接口:一个单词首字母大写,多个单词每个单词的首字母大写. 举例:Student,Car,HelloWorld 方法和变量:一个单词首字母小写,多个单词从第二个单词开始每个单词的首字母大写. 举例:age,maxAge,show(),getAge() 常量:如果是一个单词,所有字母大写,如果是多个单词

设计模式之单例模式的几种写法——java

对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Description 单例模式之饿汉模式,不会懒加载.线程安全 * @Date 2019-5-22 12:32 * @优点 线程安全,简单易实现 * @缺点 在进行类加载的时候就创建好实例,会占用内存 **/ class SingletonHungry{ //私有构造函数 private SingletonHung