`
yaya_wiscom
  • 浏览: 49941 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

单例模式的应用

 
阅读更多

本文中总结了几种常见的单例模,本文讨论的所有单例都是在同一个JVM中保证一个类只有一个实例,如果在分布式环境中不再本文的讨论范围之内。

方式一:使用全局访问点取得单实例

 

public class SingleTest {
	
	private static final SingleTest instance = new SingleTest();
	private SingleTest(){}
	
	public static SingleTest getInstance(){
		return instance;
	}

}

 

这是一种最简单的单例模式,且是线程安全的。当多个线程同时去访问该类的getInstance()方法时,不会初始化多个不同的对象,这是因为JVM在加载此类时对于static属性的初始化只能由一个线程执行且仅一次。

 

方式二:延迟创建

 

出于对性能的考虑,可以利用延迟实例化单例对象,只有在第一次使用该类的时候才去实例化。在使用延迟创建单例时需要注意多线程并发访问时的问题。

 

 

public class SingleTest {
	
	private volatile static SingleTest instance = null;
	private SingleTest(){}
	
	public static SingleTest getInstance(){
		if(instance == null){
			synchronized (SingleTest.class) {
				if(instance == null){
					instance = new SingleTest();
				}
			}
		}
		return instance;
	}

}

方式三:在JDK1.5及以上的版本中引入了枚举类型,使用枚举创建单例是一种比较简洁的方式,同时枚举又提供了序列化机制,并能够有效的抵制通过反射机制非法调用类私有的构造器的行为。

 

public enum SingleTest {
	
	INSTANCE;
	
	String instanceName = null;
	
	public String getInstanceName() {
		return instanceName;
	}
	public void setInstanceName(String instanceName) {
		this.instanceName = instanceName;
	}
	public void leaveTheBuilding(){
		
	}
}

 补充一点使用非枚举的方式创建单例时为了使Singleton类变成是可序列化的仅仅在类的申明中加上implements Serializable是不够的,为了维护并保证Singleton,必须申明所有实例域都是瞬时的(transient),并提供一个readResolve()方法,否则在每次反序列化的时候都会创建一个实例。这是在具体应用中需要注意的。

分享到:
评论

相关推荐

    单例模式应用场景

    ### 单例模式应用场景 #### 一、概述 在软件工程领域中,设计模式作为一种解决常见问题的方法,被广泛应用于各种编程环境中。其中,单例模式(Singleton Pattern)作为最简单的设计模式之一,旨在确保一个类只有一...

    Java单例模式应用研究.pdf

    ### Java单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局...

    Singleton pattern单例模式应用

    ### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...

    JAVA单例模式应用研究

    ### JAVA单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最常见的创建型设计模式之一,在软件开发中扮演着重要角色。它主要应用于需要对系统资源进行统一管理和控制的场景,例如...

    为什么要使用PHP单例模式及应用实例.docx

    - **示例**:以Zend Framework为例,其中的FrontController就是一个很好的单例模式应用案例,用于管理全局配置信息。 ##### 2.3 便于调试与日志记录 - **集中处理日志**:在单个页面请求过程中,所有相关的代码...

    单例模式应用DEMO SHOW

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在许多场景下非常有用,比如...在压缩包"Patterns"中,可能包含的是不同设计模式的示例,其中可能就有对单例模式的实现和应用。

    设计模式单例模式

    单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象创建成本较高,或者需要共享资源的情况下非常...

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

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

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,...

    单例模式介绍

    在Android开发中,单例模式应用广泛,尤其在管理全局资源、提供公共服务或优化性能时非常实用。下面我们将详细介绍六种常见的单例模式,并探讨在Android环境下如何应对反序列化安全问题。 1. 饿汉式单例(Static ...

    C++单例模式应用实例

    本文实例讲述了C++单例模式及其相关应用方法,分享给大家供大家参考。具体方法分析如下: 定义: 一个类有且仅有一个实例,并且提供一个访问它的全局访问点。 要点: 1、类只能有一个实例; 2、必须自行创建此实例;...

    单例模式.zipIOS应用例子源码下载

    这个“单例模式.zip”文件包含的是一个适用于iOS平台的单例模式应用示例源代码,对于学生、个人开发者以及公司团队来说,都是很好的学习和参考材料。 单例模式的核心思想是限制类的实例化过程,通常通过私有化构造...

    ActionScript 3.0里使用单例模式

    ### ActionScript 3.0中的单例模式应用详解 #### 一、单例模式简介 在软件工程领域,设计模式是一套被广泛接受的解决特定问题的解决方案模板。其中,“单例模式”是一种常用的创建型设计模式,它保证一个类仅有一...

    JAVA多线程并发下的单例模式应用

    JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了。今天我们将分享一个在开发过程中遇到的单例模式的应用。 单例模式的定义:...

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

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

    Android源码学习之单例模式应用及优点介绍

    在Android系统中,单例模式的应用非常广泛,尤其是在需要全局访问点或管理共享资源的场景下。接下来,我们将深入探讨单例模式的实现原理、优点以及在Android源码中的应用。 1. **单例模式实现** - **懒汉式(懒...

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...

    设计模式——单例模式

    **设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一个对象的情况下。 首先,实现C#单例模式通常有几种常见方法: 1. 饿汉式(静态常量...

Global site tag (gtag.js) - Google Analytics