`
zy19982004
  • 浏览: 663742 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:252400
社区版块
存档分类
最新评论

设计模式学习七:单例模式

阅读更多

一.概念

     确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

 

二.UML

 

 

三.三种单例模式

  • 饿汉模式:在类加载的时候就实例化一个自己的对象。

 

package com.zzy.singleton;
/**
 * 饿汉模式
 * @author eason
 *
 */
public class Singleton {
	//JVM在静态初始块中创建对象
	//保证了在任何线程访问singleton变量之前,一定先创建此实
	//保证了线程安全
	//static确保Singleton类只有一个实例
	//保证了单例
	private static Singleton singleton = new Singleton();
	
	//private构造函数,只能在该类内部使用
	private Singleton(){
	}
	
	public static Singleton getInstance() {
		return singleton;
	}
	
}

 

  • 懒汉模式:在实例第一次被引用时才将自己实例化

 

package com.zzy.singleton;
/**
 * 懒汉模式
 * @author eason
 *
 */
public class Singleton {
	//static确保Singleton类只有一个实例
	//保证了单例
	private static Singleton singleton = null;
	
	//private构造函数,只能在该类内部使用
	private Singleton(){
	}
	
	//synchronized确保每个线程在进入getInstance方法前
	//要先等到别的线程离开该方法
	//也就是说,最极端的情况时也不会有两个线程同时进入该方法,不会 new Singleton()两次
	//保证了线程安全
	public static synchronized Singleton getInstance() {
		if(singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
	

 

  • 双重检查模式:相比懒汉模式中的每次调用getInstance方法都需要同步,双重检查模式只有第一次调用getInstance方法才会进入此同步块

 

package com.zzy.singleton;
/**
 * 双重检查模式
 * @author eason
 *
 */
public class Singleton {
	//static确保Singleton类只有一个实例
	//保证了单例
	//volatile确保当singleton被初始化成Singleton实例时
	//多个线程正确处理singleton变量
	private volatile static Singleton singleton = null;
	
	//private构造函数,只能在该类内部使用
	private Singleton(){
	}
	
	public static Singleton getInstance() {
		//如果实例不为空,进入同步区
		if(singleton == null) {
			//只有第一次调用getInstance方法才会进入此同步块
			synchronized (Singleton.class) {
				//为什么这里还要检查一次???因为可能多个线程同时进入上一个if判断里面
				if(singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
	
}

 

四.使用场景

     系统只需要拥有一个的全局对象。比喻线程池,日志对象等等。

 

五.单例的演变

1
0
分享到:
评论
5 楼 这些年 2014-06-05  
//为什么这里还要检查一次??? 

因为在第一个if时可能有多个线程已经进入
4 楼 ls8023 2012-02-21  
不错   接受
3 楼 zy19982004 2012-02-20  
suhui2009 写道
楼主能不能举个具体点的例子呢,看不太懂啊,特别是最后一个

具体的例子还确实很难举,任何一个类,我们都能写出它的单例出来。
以java.lang.Runtime类为例子

1.其文档说道:/**
* Every Java application has a single instance of class
* <code>Runtime</code> that allows the application to interface with
* the environment in which the application is running. The current
* runtime can be obtained from the <code>getRuntime</code> method.
* <p>
* An application cannot create its own instance of this class.
*
所以我们知道Runtime是单例类,或者我们不看文档也应该知道Runtime是单例类。


2.既然知道了,就去套单例的概念呗:
  2.1 确保一个类只有一个实例,
     代码private static Runtime currentRuntime = new      Rutime();就实现了。
  2.2 并提供一个全局访问点来获取该实例,
     代码public static Runtime getRuntime() {
     return currentRuntime;
      }
     和private Runtime() {}
     就实现了


至于第二种模式和第三者模式,只是单例的不同实现罢了,在了解多线程的基础上,很容易看懂。掌握了概念,就掌握了一切。
2 楼 suhui2009 2012-02-20  
楼主能不能举个具体点的例子呢,看不太懂啊,特别是最后一个
1 楼 fjc04091125 2012-02-20  
不错,很明白

相关推荐

    C++中的三大设计模式:单例模式、工厂模式与观察者模式的代码实现

    内容概要:本文档介绍了三个经典的软件设计模式——单例模式(Singleton Pattern)、工厂模式(Factory Pattern)以及观察者模式(Observer Pattern)的具体实现,并给出了带有详细注释的C++代码范例。对每个设计模式都有...

    白话讲解创建型设计模式:单例原型构建

    在软件设计中,设计模式是一种解决常见问题的模板,它们是经过验证的、高效的设计解决...因此,不断学习和实践设计模式是每个开发者成长的必经之路。如果你在实际开发中遇到了理解上的困难,欢迎与他人交流,共同进步。

    开发模式:单例和工厂开发模式视频与代码

    本文将详细探讨两种重要的设计模式:单例模式和工厂模式,并结合视频教程与代码示例,帮助读者深入理解这两种模式的实现原理和应用场景。 首先,我们来探讨单例模式。单例模式是一种确保一个类只有一个实例并提供...

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    设计模式C++学习之单例模式(Singleton)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...

    设计模式入门之一:深入单例模式

    单例模式是设计模式中最基础且常用的一种,它旨在确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,有些对象只需要一个实例就能满足需求,比如线程池、数据库连接、配置管理等。使用单例模式可以避免...

    设计模式 中的 单例模式和观察者模式

    设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在给定的标题和描述中,我们关注的是两种重要...在学习和实践中,可以尝试结合不同的设计模式,创造出更加灵活和高效的软件架构。

    设计模式之单例模式(结合工厂模式)

    在项目中,`src`目录可能包含了这些设计模式的源码示例,可以用来学习和理解如何实际应用单例模式和工厂模式。通过阅读和分析这些代码,你可以更深入地理解这两种模式的实现细节及其在实际开发中的作用。同时,也...

    东北大学四种设计模式实验

    本实验“东北大学四种设计模式实验”旨在帮助学生深入理解和掌握四种经典的设计模式:单例模式、组合模式、Builder模式以及装饰器模式,并通过实际应用,将这些模式应用于构建一个赌场系统,从而提升代码的可读性、...

    Java 经典设计模式讲解以及项目实战

    1 单例模式 2 责任链模式 3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 ...

    《Java设计模式》课程设计报告.docx

    这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为初学者提供了一个良好的实践平台。 1. **单例模式**: 单例模式是一种确保一个类只有一个实例并提供全局访问点的设计模式。...

    Qt单例设计模式(1-8)

    在软件开发中,设计模式是一种在特定情境下解决常见问题的经验总结,被广泛应用于各种编程语言中。在Qt框架中,单例设计模式是一...通过学习和实践,你将能够更好地理解和运用Qt中的单例设计模式,提升你的Qt编程技能。

    设计模式单例模式PPT学习教案.pptx

    设计模式单例模式学习教案 单例模式概述 单例模式是设计模式中的一种,用于确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式对对象的创建和访问进行了限制,以确保系统中只有一个实例...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    在编程领域,设计模式是一种被广泛接受的解决常见问题的模板或最佳实践。Java作为一款广泛应用的面向对象的编程语言,其设计模式的应用...通过学习和熟练掌握这些设计模式,开发者能够更好地应对复杂软件工程的需求。

    Java设计模式 基础学习,适合初学者入门!

    这份资料非常全面且详细,覆盖了 设计模式 基础学习的方方面面,非常适合初学者入门! 资料也按目录进行编排,每一章下面都有更具体的内容: 结构型模式(7节) 第1节:适配器模式 第2节:桥接模式 第3节:组合模式 ...

    设计模式之单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制系统资源(如数据库连接池)、配置管理、日志服务等,确保在整个应用...

    C#设计模式(1)——单例模式.pdf

    其中,《Head First 设计模式》是一本广受好评的设计模式入门书籍,非常适合初学者学习。本次将聚焦于一种较为简单的模式——单例模式。 #### 单例模式概述 单例模式是一种创建型模式,它的核心在于确保某个类只有...

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

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

    JavaScript设计模式中的单例模式和观察者模式.docx

    ### JavaScript设计模式详解:单例模式与观察者模式 #### 一、单例模式 **定义**:单例模式是一种常用的软件设计模式,其目的是确保某个类只有一个实例,并且能够提供一个全局访问点来访问该实例。在JavaScript中...

    设计模式:可复用面向对象软件的基础(非扫描版+高清)

    对于初学者,可以从理解设计模式的基本概念开始,然后通过实例学习和练习各种模式,接着深入研究C++如何实现这些模式,最后结合实际项目应用,巩固和提升设计模式的运用能力。 总之,《设计模式:可复用面向对象...

Global site tag (gtag.js) - Google Analytics