`

3、单例模式

 
阅读更多

单例模式

1、三大要点

(1)只能有一个实例

(2)自己创建实例

(3)必须自行向整个系统中提供这个实例

因此单例类中的构造方法必须是私有方法

 

2、饿汉式单例类

/**
 * 饿汉式单例
 * @author Administrator
 *
 */
public class Singeton {
	/**
	 * 加载对象时创建Singeton类
	 */
	private static Singeton instance = new Singeton();

	/**
	 * 构造方法为私有
	 */
	private Singeton(){}
	
	/**
	 * 获得单例对象
	 * @return
	 */
	public static Singeton getInstance(){
		return instance;
	}
	
}

 当加载这个类时私有变量instance被初始化,单例中唯一的实例也就被创建了。

 

3、懒汉式单例

(1)通过synchronized解决多线程同步问题

/**
 * 懒汉式单例
 * @author Administrator
 *
 */
public class Singeton {

	private static Singeton instance =  null;
	/**
	 * 构造方法为私有
	 */
	private Singeton(){}
	
	/**
	 * 获得单例对象
	 * 需要的时候创建对象
	 * @return
	 */
	public synchronized static Singeton getInstance(){
		if(instance == null){
			instance = new Singeton();
		}
		return instance;
	}
	
}

 懒汉式单例在第一次调用静态方法getInstance时实例化对象。这里主要在getInstance方法上使用了同步化是为了解决多线程问题。

 

(2)通过volidate解决多线程同步问题,并提高性能。

方法中添加synchronized时普通方法执行时间的100倍,因此我们下面采用volidate解决同步问题并提高性能

/**
 * 懒汉式单例
 * @author Administrator
 *
 */
public class Singeton {

	private static volidate Singeton instance =  null;
	/**
	 * 构造方法为私有
	 */
	private Singeton(){}
	
	/**
	 * 获得单例对象
	 * 需要的时候创建对象
	 * @return
	 */
	public static Singeton getInstance(){
		if(instance == null){
			synchronized(Sington.class){ 
				if(instance == null){
					instance = new Singeton();
				}			
			}
		}
		return instance;
	}
	
}

 

 这样就可以解决不用每次调用getInstance方法都执行同步操作,从而提高代码执行效率。

 

4、登记式单例

/**
 * 登记式单例
 * @author qiang
 *
 */
public class Singeton {
	
	private static Map<String, Singeton> cache = new HashMap<String, Singeton>();
	
	static{
		Singeton s = new Singeton();
		cache.put("com.uwaysoft.desginmode.singeton.Singeton", s);
	}
	
	public static Singeton getInstance(String name){
		if(name == null){
			name = "com.uwaysoft.desginmode.singeton.Singeton";
		}
		if(cache.get(name) == null){
			try {
				Object obj = Class.forName(name);
				cache.put(name, (Singeton)obj);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		return cache.get(name);
	}

}

 为了解决懒汉式单例和饿汉式单例不能被继承的问题,因此出现了登记式单例

分享到:
评论

相关推荐

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

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

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

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一...

    设计模式——单例模式

    3. **枚举单例模式** ```java public enum Singleton { INSTANCE; } ``` 利用 Java 枚举的天然线程安全特性,这是一种简洁且高效的方式。同时,枚举避免了序列化导致的多实例问题。 以上就是关于单例模式的一些...

    7种单例模式

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

    使用单例模式实现计数器

    其中,单例模式是一种非常经典且常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在C#中,我们可以利用单例模式来创建一个计数器类,以确保在整个应用程序的生命周期内,计数器只...

    几种单例模式demo

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    设计模式之单例模式源码demo

    3. **双重检查锁定(DCL,Double Check Locking)单例模式**:结合了饿汉模式和懒汉模式的优点,既延迟了初始化,又保证了线程安全。在多线程环境下,只有在`instance`为`null`时才会进入同步块,避免了不必要的同步...

    单例模式应用场景

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

    连接数据库单例模式

    ### 连接数据库单例模式解析 在软件开发过程中,特别是在涉及到数据库操作的应用程序中,合理地管理和控制数据库连接是非常重要的。不当的数据库连接管理可能会导致资源浪费、性能下降甚至是系统崩溃等问题。为了...

    Java设计模式之单例模式的七种写法

    Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...

    单例模式PHP实现代码类.zip

    3. **单例模式的优点**: - 资源管理:单例模式可以有效地管理共享资源,避免资源浪费。 - 控制实例化:可以控制何时、如何以及是否实例化对象。 - 全局访问点:提供了全局访问对象的途径,简化了对象的调用。 4...

    设计模式单例模式

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

    Java 单例模式.pptx

    ### Java 单例模式详解 #### 一、什么是单例模式? 单例模式是一种常用的软件设计模式,在这种模式中,一个类只能拥有一个实例,并且该类必须自行创建并提供这个实例。通常,单例模式用于确保某个类在整个应用程序...

    单例模式的要点及模式

    单例模式是软件设计模式中的一种经典模式,其核心思想在于限制类的实例化过程,确保在整个应用程序中只有一个实例存在。这种模式常用于管理共享资源,例如数据库连接、线程池或者全局配置等,以避免资源浪费和状态...

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

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

    单例模式,single

    ### 单例模式详解 #### 概述与应用场景 单例模式是一种常用的设计模式,它的主要目的是确保某个类仅有一个实例,并提供一个全局访问点。这种模式非常适合那些在整个应用程序生命周期中只需要一个实例的对象,例如...

    23钟设计模式之单例模式

    单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...

Global site tag (gtag.js) - Google Analytics