`
soongbo
  • 浏览: 88654 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入浅出设计模式之单态模式(singleton)

 
阅读更多
                                                  深入浅出设计模式之单态模式(singleton)


单态定义:

     单态是指在一个JVM实例中,只存在一个对应Class的实例对象。

单态可以分为状态化和无状态化使用方式,比如网站的访问次数计数器,这个是有状态的实现,单态能够保存这个计数,并且使用同步或原子变量实现计数。另外,单态也可以无状态使用,提供工具性质的工作。使用单态模式的直接好处就是限制了实例个数,节省内存资源,有利于Java垃圾回收。

如何使用单态模式?

目前单态模式支持如下三种实现:

1. 饿汉模式:

public class Singleton1 {
	
	private static final Singleton1 INSTANCE = new Singleton1();
	
	private Singleton1() {}
	
	public static Singleton1 getInstance() {
		return INSTANCE;
	}
}




      饿汉模式形象的描述了单列实例化的时间点,也就是在Class对象完成加载后就直接创建了该单列对象,而不是在第一次使用的时候才创建。这一点原理类似于Spring的BeanFactory和ApplicationContext类在创建Bean对象时候的区别,前者是第一次使用的时候创建bean,后者是在Spring容器启动时创建好了所有bean,这两种创建方式各有优势,但目前大部分应用主要采用的是第二种实现方式。

2. 饱汉模式:


(1) 使用同步关键字

public class Singleton3 {
	
	private static Singleton3 INSTANCE;
	
	private Singleton3() {}
	
	public static synchronized Singleton3 getInSingleton() {
		if (INSTANCE == null) {
			INSTANCE = new Singleton3();
		}
		return INSTANCE;
	}
}




(2) DCL方式

public class Singleton2 {
	
	private volatile static Singleton2 INSTANCE;
	
	private Singleton2() {}
	
	//DCL
	public static Singleton2 getInstance() {
		if (INSTANCE == null) {//--------(1)
			synchronized (Singleton2.class){//----------(2)
				if (INSTANCE == null) {
			            INSTANCE = new Singleton2();//-------------(3)
			}
			}
		}
		return INSTANCE;
	}
}




     饱汉模式的实现是单态模式中最容易出错,也是问题最多的一种实现方式,我们常见的DCL(双锁检查机制),就是这种方式提出来衍生出来的问题。

在双锁检查机制中,很多开发者,或者说很多已经在生产环境运行的程序可能都存在着一定的问题,虽然这些小问题发生的几率极小,但是理论上是存在的,在此处,我们来详细讨论这个问题。双锁检查对机制中属性没有加volatile关键字,可能存在错误。

       • 外部获得一个没有被初始化完成的对象

      很多从事Java开发的程序员可能只知道Volatile关键字保证了多线程的可见性,而还有一种特性就是:保证该关键字修饰的对象被初始化完成。我们来假设一个前提,假设Singleton2对象的初始化需要做很多工作,需要很长的时间才能完成。在程序运行,由于JMM对程序运行多了优化,可是使一个对象获得没有被初始化完成的引用,所以很有肯能导致外部对象获得一个没有初始化完成的Singleton2的应用,即便这种情况的发生的几率十分小,但是理论上还是存在,我们需要理解到这一点,以便我们编写出高质量的代码。

3. 延迟加载模式

     延迟加载模式也许这种叫法不是很标准,姑且这样称呼。在该模式下,使用一个内部类来实例化外部的单态对象,这样做的优势是,即满足了延迟加载的思想,提高代码的运行效率,而且又保证了对象创建的安全性。所以该模式是比较值得推荐的一种单态模式实现。具体代码如下:

public class Singleton4 {
	
	private static class SingletonHolder {
		public static final Singleton4 INSTANCE = new Singleton4();
	}
	
	private Singleton4() {}
	
	public static Singleton4 getInstance() {
		return SingletonHolder.INSTANCE;
	}
}


分享到:
评论
1 楼 Terry_zzz 2012-04-11  
很好, 总结的很全面 谢谢!

相关推荐

    深入浅出设计模式之单件模式

    ### 深入浅出设计模式之单件模式 #### 一、单件模式概述 单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都...

    设计模式之Singleton(单态)

    **设计模式之Singleton(单态)** Singleton设计模式是一种创建型设计模式,它的核心目标是确保在应用程序中只有一个类的实例,并提供一个全局访问点来获取这个唯一实例。这种模式在资源管理、缓存、日志记录、线程池...

    JAVA设计模式(单态模式和简单工厂模式)

    单态模式的定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在项目的很多地方都会用到它,比如说数据库的链接。 使用Singleton的好处还在于可以节省内存,因为它限制了实例...

    Java设计模式之单态模式(Singleton模式)介绍

    单态模式(Singleton模式)是Java设计模式中的一种,它的主要目标是确保一个类在整个应用程序中只有一个实例存在。这种模式的应用场景广泛,特别是在需要全局共享的资源管理、配置中心、日志服务等场合非常常见。 ...

    JAVA设计模式chm文档

    设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享...

    Java中单态设计模式

    ### Java中单态设计模式详解 #### 一、引言 设计模式是在长期软件开发过程中提炼出来的最佳实践,它们提供了一种标准化的方式用于解决特定类型的问题。对于Java开发者而言,熟悉并掌握各种设计模式是非常重要的,...

    设计模式一点通之单态模式

    单态模式(Singleton Pattern)是设计模式中的一种基础模式,主要用来确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,当一个类只能有一个实例而且客户可以从一个众所周知的访问点访问它时,这样的...

    设计模式文档 chm

    设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享...

    【Java设计模式】单态模式

    单态模式是在面向对象设计中实现类似单例行为的一种替代方法,确保Java应用程序中的共享状态。它强制实现一种独特的行为,即类的所有实例共享相同的状态。与单例模式不同,单例模式将类限制为单个实例,单态模式允许...

    设计模式一点通之单态模式 C++

    单态模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,且只允许存在一个实例的情况下非常有用,例如配置管理、线程池、缓存...

    GoF 23种设计模式的详解与应用

    创建模式:设计模式之Factory,设计模式之Prototype(原型),设计模式之Builder,设计模式之Singleton(单态). 结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite...

    单态模式(代码)

    单态模式(Singleton Pattern)是软件设计模式中的一种,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、缓存管理和日志记录等,因为它可以确保在整个系统中...

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

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

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

    Net单态模式的案例

    在.NET环境中,无论是C#还是ASP.NET项目,单态模式都是经常被用到的设计模式之一,尤其在处理全局配置、数据库连接、缓存管理等场景下。 在C#中实现单态模式,通常有几种常见的方法: 1. **懒汉式**:延迟初始化,...

    单态模式(PPT)

    单态模式,是一种常用的软件设计模式,其核心思想是确保一个类在整个应用程序中只有一个实例,并提供全局访问点。这种模式的出现主要是为了解决对象创建的控制问题,特别是在某些需要频繁创建和销毁的对象中,单态...

    设计模式整理(很全)

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

    JAVA设计模式23种

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

    单态模式的设计和应用

    单态模式(Singleton Pattern)是一种常用的软件设计模式,它的核心目标是确保一个类在整个应用程序中只有一个实例,并提供全局唯一的访问点。这种模式在资源管理、配置管理、对象协调等方面有广泛应用,例如创建...

    设计模式之创建型模式

    本资源包"设计模式之创建型模式"包含了对工厂模式和单态模式的详细讲解,是初学者深入理解这些概念的理想资料。 首先,我们来看工厂模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂...

Global site tag (gtag.js) - Google Analytics