`
SunnyYoona
  • 浏览: 361484 次
社区版块
存档分类
最新评论

[设计模式实践之路](1)单例模式

 
阅读更多

【简介】

单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。
实现单例模式的一个最好的方法就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以创建,并且它可以提供一个访问该实例的方法。

【特点】

单例模式具有一下特点:
  • 单例类只有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例

【分类】

主要的就是懒汉单例,饿汉单例

【懒汉单例】

package Mode;

/**
 * Java设计模式之单例模式
 * @author SJF0115
 *
 */
public class Singleton {

	private static Singleton instance;
	// 构造方法让其private,这就堵死了外界利用new创建此类实例的可能
	private Singleton() {
	}
	// 此方法是获得本实例的唯一全局访问点
	public static Singleton GetInstance(){
		// 若实例不存在,则new一个新实例,否则返回已有的实例
		if(instance == null){
			instance = new Singleton();
		}
		return instance;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Singleton s1 = Singleton.GetInstance();
		Singleton s2 = Singleton.GetInstance();
		if(s1 == s2){
			System.out.println("两个对象是相同的实例");
		}
		else{
			System.out.println("两个对象不是相同的实例");
		}
	}
}

这种写法lazy loading很明显,但是致命的是在多线程不能正常工作(多线程不安全)。

在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。


【饿汉单例】

package Mode;

/**
 * Java设计模式之单例模式
 * @author SJF0115
 *
 */
public class Singleton {

	// 类装载时就实例化
	private static Singleton instance = new Singleton();
	// 构造方法让其private,这就堵死了外界利用new创建此类实例的可能
	private Singleton() {
	}
	// 此方法是获得本实例的唯一全局访问点
	public static Singleton GetInstance(){
		return instance;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Singleton s1 = Singleton.GetInstance();
		Singleton s2 = Singleton.GetInstance();
		if(s1 == s2){
			System.out.println("两个对象是相同的实例");
		}
		else{
			System.out.println("两个对象不是相同的实例");
		}
	}
}

这种方式基于classloder机制避免了多线程的同步问题,因此饿汉单例是线程安全的。

不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,

但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。

【懒汉单例(线程安全)】

package Mode;

/**
 * Java设计模式之单例模式
 * @author SJF0115
 *
 */
public class Singleton {

	private static Singleton instance;
	// 构造方法让其private,这就堵死了外界利用new创建此类实例的可能
	private Singleton() {
	}
	// 此方法是获得本实例的唯一全局访问点
	public static  Singleton GetInstance(){
		// 若实例不存在,则new一个新实例,否则返回已有的实例
		if(instance == null){
			synchronized(Singleton.class){
				if(instance == null){
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Singleton s1 = Singleton.GetInstance();
		Singleton s2 = Singleton.GetInstance();
		if(s1 == s2){
			System.out.println("两个对象是相同的实例");
		}
		else{
			System.out.println("两个对象不是相同的实例");
		}
	}
}

有人可能会疑问,在GetInstnce方法中为什么会有两次判断if(instance == null)。

回答:

对于instance存在的情况,就直接返回。不需要考虑线程问题。当instance为null时,就需要我们考虑多线程带来的问题。

假设当instance为null,并且同时有两个线程调用GetInstance()方法,他们都可以通过第一重instance == null的判断。

然后由于Synchronized机制,这两个线程只有一个进入,另一个在外排队等候,必须等先进入的线程结束之后,才能进入。

而此时如果没有第二重instance == null 判断,第一个线程进入后创建一个实例,第一个线程进入出来后,第二个线程终于等待结束,可以进入,

继续又创建了一个实例,这没有达到单例的目的。







分享到:
评论

相关推荐

    设计模式系列之01-单例模式(Singleton模式)

    设计模式系列之01-单例模式(Singleton模式),很好的资源,理论实践结合讲述,逐步更新

    01.Java设计模式之 单例模式.pdf

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    单例设计模式五种例子

    通过C#详细讲解设计模式,通俗易懂,适合刚了解设计模式的同志们

    JavaScript设计模式之单例模式详解

    这一次重温一下《JavaScript设计模式与开发实践》,开篇为单例模式。 /** * pre 单例模式 * 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 * 应用:单例模式是一种常用的模式,有一些对象我们...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    小D深入浅出设计模式+框架源码剖析实战

    ├─第一章 旭瑶-小滴架构师成长系列软件设计模式课程介绍 │ 1.2设计模式全家桶课程大纲速览.mp4 │  ├─第二章 想成为架构师的你,不可不知道的设计模式精髓 │ 2.1设计模式的六大原则你知道多少.mp4 │ 2.3...

    java设计模式-单例模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    1. 创建型模式:创建型模式关注对象的创建过程,包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式。这些模式可以帮助我们更灵活地创建对象,避免直接使用new关键字来创建对象,降低...

    java设计模式学习文档.pdf

    培养学生掌握简单工厂模式、工厂方法模式、单例模式、原型模式、桥接模式、适配器模式、装饰模式、代理模式、命令模式、观察者模式等常用设计模式的设计思想,并掌握在实际软件工程领域中的运用,能够把所学的原理...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    Java 设计模式详解超详细(含示例代码)

    Java设计模式是软件开发中常见问题的标准解决方案,它们是经过时间考验和实践证明的有效设计方法。设计模式的目标是提高代码的可重用性、可维护性和可读性,同时减少设计和实现中的复杂性。 Java设计模式可以分为...

    设计模式(Java源码示例,超经典).rar

    1.包括GOF提出的23种设计模式; 2.采用Java做为源代码示例; 3.源代码的package分类非常清楚,模式类型->模式名称->模式种类->示例->角色名称,让您一下就看清楚共几种设计模式,具体的一种设计模式又有几种细分,每...

    java版本的设计模式的实现demo

    设计模式是软件开发中的经典实践,它们为解决特定问题提供了通用、可复用的解决方案。在Java编程中,运用合适的设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是关于Java版本设计模式实现demo的一些补充...

    常用开发模式讲解.zip

    设计模式是在软件开发中解决常见问题的最佳实践。它们是在大量项目中积累的经验的总结,旨在提高代码的可重用性、可维护性和可扩展性。下面介绍几种常用的设计模式,包括单例模式、工厂模式、观察者模式、建造者模式...

    软件设计模式实训.7z

    培养学生掌握简单工厂模式、工厂方法模式、单例模式、原型模式、桥接模式、适配器模式、装饰模式、代理模式、命令模式、观察者模式等常用设计模式的设计思想,并掌握在实际软件工程领域中的运用,能够把所学的原理...

    DesignPattern:设计模式代表了经验丰富的面向对象软件开发人员所使用的最佳实践。设计模式是针对软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是在相当长的一段时间内由众多软件开发人员通过反复试验而获得的

    例如,单例设计模式表示使用单个对象,因此所有熟悉单一设计模式的开发人员都将使用单个对象,并且他们可以彼此告知程序正在遵循单例模式。 最佳实践 设计模式已经发展了很长一段时间,它们为软件开发过程中遇到的...

    JAVA中常用的设计模式:单例模式,工厂模式,观察者模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    掌握Spring设计模式:Java工程师必备指南

    作为一个资深Java工程师,我发现《Spring 设计模式总结》PDF非常精彩,它深入剖析了Spring框架中的关键设计模式。例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过...

    二十三种设计模式【PDF版】

    设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

Global site tag (gtag.js) - Google Analytics