`

设计模式 单例模式

 
阅读更多

单例模式(Singleton):

   保证一个类仅有一个实例,并提供一个访问它的全局访问点

 

   通常我们可以设定一个全局变量使得一个对象被访问,但不能阻止你实例化多个对象。

   最好的办法是:

        让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法

 

 

   JAVA的单例有以下几种实现方式:

   1.饿汉式

      在类初始化时,实例化本身。

 

/**
 * 饿汉式单例模式
 * @author wsg
 *
 */
public class Singleton {
	private static final Singleton singletonInstance = new Singleton();
	
	/**
	 * 私有构造函数
	 */
	private Singleton(){		
	}
	
	/**
	 * 返回该单例实例
	 * @return Singleton
	 */
	public static Singleton getInstance(){
		return singletonInstance;
	}
}

 

  2.懒汉式 - 延迟加载

     在第一次类调用的时候实例化.

 

/**
 * 懒汉式单例模式
 * @author wsg
 *
 */
public class Singleton {
	private static Singleton singletonInstance = null;
	
	/**
	 * 私有构造函数
	 */
	private Singleton(){
		
	}
	
	/**
	 * 返回该单例实例
	 * @return Singleton
	 */
	public synchronized static Singleton getInstance(){
		if(null==singletonInstance){
			singletonInstance = new Singleton();
		}
		return singletonInstance;
	}
}

 

 3.基于注册的单例模式

    避免在编译期指定单例类的不灵活方式

 

import java.util.HashMap;

/**
 * 基于注册的单例模式
 * 
 * @author wsg
 * 
 */
public class Singleton {
	private static HashMap regMap = new HashMap();

	/**
	 * 私有构造函数
	 */
	private Singleton() {
	}

	/**
	 * 返回该单例实例
	 * 
	 * @return Singleton
	 */
	public synchronized static Singleton getInstance(String className) {
		Singleton singleton = (Singleton) regMap.get(className);
		if (singleton == null) {
			try {
				singleton = (Singleton) Class.forName(className).newInstance();
			} catch (ClassNotFoundException cnf) {
				System.out.println("Couldn't find class " + className);
			} catch (InstantiationException ie) {
				System.out.println("Couldn't instantiate an object of type " + className);
			} catch (IllegalAccessException ia) {
				System.out.println("Couldn't access class " + className);
			}
			regMap.put(className, singleton);
		}
		return singleton;
	}

	/**
	 * 防止通过序列化之后的重构来得到不同的实例
	 * 
	 * @return
	 */
	private Object readResolve() {
		return this.getInstance(this.getClass().getName());
	}
}

 

 单例模式所要避免的一些问题:

   1.在懒汉式单例中,构造函数的私有private ,会导致该类无法进行扩展,不能继承。

      此时还不如声明该类为final,这样意图明显,还可以让编译器更好的进行性能优化。

 

      如果不是用private,而使用protocted,则在该单例内所属包下别的类依旧可以new Singleton(),

      此时出现的情形与单例模式相左。

      解决方案是:把该单例类放入一个外在的包中,以避免其他类实例化该单例类。

 

   2.如果单例由不同的类装载器装入,那便有可能存在多个单例类的实例。

      假定不是远端存取,例如一些servlet容器对每个servlet使用完全不同的类装载器,这样的话如 果有两个servlet访问 一个单例类,它们就都会有各自的实例。 

 

   3.如果Singleton实现了java.io.Serializable接口,那么这个类的实例就可能被序列化和复原。

      如果你序列化一个单例类的对象,接下来复原多个那个对象,那你就会有多个单例类的实例。

 

   4.线程安全问题。

      如果Singleton类不是线程安全的。有两个线程,我们称它们为线程1和线程2,在同一时间调用

      getInstance()方法,线程1先进入if块,然后线程2进行控制。

      此时就会产生两个Singleton实例。

分享到:
评论

相关推荐

    设计模式单例模式

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

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

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

    设计模式 单例模式 java

    设计模式 单例模式 java

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

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

    C++设计模式-单例模式

    李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。

    java 设计模式 单例模式

    //单例模式,始终只产生一个对象 /*public class SingleTest { public static void main(String[] args) { SingleTon singleTon1=SingleTon.getInstance(); SingleTon singleTon2=SingleTon.getInstance(); ...

    23钟设计模式之单例模式

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

    设计模式——单例模式

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

    设计模式单例模式示例代码(python--c++)

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制特定资源的访问,或者在整个应用中只创建一次数据库连接等。 在C++...

    设计模式之单例模式和工厂模式

    细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解

    设计模式单例模式.zip

    单例模式是软件设计模式中的一种经典模式,它在计算机科学中被广泛应用于创建和管理一个类的唯一实例。这个模式的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这样的设计可以避免...

    设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)

    单例模式是软件设计模式中的一种基础且广泛应用的模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、缓存等场景下非常常见,因为它可以避免因频繁创建和销毁对象而...

    大话设计模式--Singleton(单例模式)

    单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...

    Java设计模式单例模式(Singleton)用法解析

    Java设计模式单例模式(Singleton)用法解析 java设计模式单例模式(Singleton)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局反访问点。单例模式是创建型模式。单例模式在生活中应用也很广泛,...

    设计模式实验报告-单例模式 .docx

    设计模式实验报告

    单例模式实现mdi界面子窗体控制

    首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述

    C++单例设计模式,单例模式

    C++单例设计模式,单例模式 C++单例设计模式,单例模式

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

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

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    Java设计模式之单例模式讲解

    入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...

Global site tag (gtag.js) - Google Analytics