`

常用设计模式----单例模式

 
阅读更多
package org.design.patterns;
/**
 * 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局(static)访问点。
 */

//延迟实例化的实现方法(不能用于多线程情况)
//如果不考虑多线程的情况,就选用该方法实现单例模式。
public class Singleton {
 private static Singleton uniqueInstance;

 private Singleton() {
 }

 public static Singleton getInstance() {
  if (uniqueInstance == null) {
   uniqueInstance = new Singleton();
  }
  return uniqueInstance;
 }
}

// ------------------------------------------------------
//急切实例化的实现方法(可用于多线程情况)
//JVM在加载该类的时候就马上创建了一个实例化对象
//如果对象不是太大,初始化和运行不是很消耗资源,并且有多线程的考虑时,可以用这种实现方式。
class Singleton2 {
 private static Singleton2 uniqueInstance = new Singleton2();

 private Singleton2() {
 }

 public static Singleton2 getInstance() {
  return uniqueInstance;
 }
}

//在getInstance方法上加入synchronized关键字,用于多线程情况
//这种方式虽然也能够解决多线程的问题,但是由于每一次调用getInstance方法时,
//都要做同步处理 (synchronized),而实际上,只有当uniqueInstance为空时才需要同步,
//这样就大大影响了方法的执行效率,不推荐使用。
class Singleton3 {
 private static Singleton3 uniqueInstance;

 private Singleton3() {
 }

 public static synchronized Singleton3 getInstance() {
  if (uniqueInstance == null) {
   uniqueInstance = new Singleton3();
  }
  return uniqueInstance;
 }
}

//用"双重检查加锁",只有uniqueInstance为空的情况下才加锁,在巧妙的提升了性能,用于多线程情况
//该方法是多线程情况下的首选。
class Singleton4 {
 //volatile关键字的确保了:写入 volatile 字段 happen-before 每个后续读取相同字段。
 //这样就保证了:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量。
 private volatile static Singleton4 uniqueInstance;

 private Singleton4() {
 }

 public static synchronized Singleton4 getInstance() {
  if (uniqueInstance == null) {//第一次验空,如果为空才进入同步(事实上,只第一次的情况)
   synchronized (Singleton4.class) {
    if (uniqueInstance == null) {//第二次验空,空了就创建实例
     uniqueInstance = new Singleton4();
    }    
   }
  }
  return uniqueInstance;
 }
}

/*说明:
 * 单例模式在Java中存在的缺陷:
 * (1)多个虚拟机
 *   当系统中的单例类被copy运行在多个虚拟机下的时候,每一个虚拟机下都可以创建一个实例对象。
 *   在使用了EJB、JINI、RMI技术的分布式系统中,由于中间件屏蔽掉了分布式系统在物理上的差异,
 *   所以,想知道具体哪个虚拟机下运行着哪个单例对象是很困难的。
 *   因此,在使用了以上分布式技术的系统中,应该避免使用“存在状态”的单例模式,因为一个有状态的
 *   单例类,在不同虚拟机上,各个单例对象保存的状态可能是不一样的,问题就随之产生。
 * (2)多个类加载器
 *   当存在多个类加载器的时候,即使它们加载的是同包名,同类名甚至每个字节都完全相同的类,也会被区别对待。
 *   因为不同的类加载器会使用不同的命名空间(nameSpace)来区分一个类。因此,单例类在多个加载器的环境下
 *   会产生多个单例对象。
 * (3)串行化(可序列化)
 *   为了使一个单例类变成可串行化的,仅仅在声明中添加"implement serializable"是不够的。因为一个串行化对象
 *   在每次反串行化的时候都会创建一个新的对象,而不仅仅是一个队原对象的引用。
 *   基于xml格式的对象串行化的方式也存在上述问题,这些个时候,使用单例要当心。
 */
分享到:
评论

相关推荐

    java设计模式----单例模式

    单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、管理复杂的初始化过程以及在系统中创建一个全局的配置对象等。 单例模式分为两种...

    ava常用设计模式-单例模式

    ava常用设计模式-单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一...

    Java设计模式-单例模式详解

    单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 实现单例模式的步骤: 1. 只有 ...

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

    总之,单例模式是一种常用的设计模式,它的目的是控制类的实例化过程,保证全局只有一个实例。理解并熟练掌握单例模式的实现方式及其适用场景,对于编写高效、可维护的代码具有重要意义。在编程实践中,应根据项目...

    PHP5设计模式-单例模式

    单例模式是一种常用的设计模式,它在软件工程中扮演着控制类实例化过程的角色,确保一个类只有一个实例,并提供全局访问点。这种模式在PHP中尤其常见,特别是在需要频繁实例化然后销毁的对象,或者需要控制共享资源...

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

    **单例模式**是软件设计模式中...综上所述,单例模式在C++编程中是一种常用的设计模式,用于控制类的实例化过程,保证全局唯一性。在实际开发中,要根据项目需求选择合适的实现方式,并注意线程安全和内存管理等问题。

    1.设计模式-单例设计模式1

    单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式通常有多种方式,包括懒汉模式、饿汉模式、静态内部类以及枚举类型。 1. **懒汉模式**: 懒汉...

    设计模式-Java单例模式的各种实现实例

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。这种模式通常用于需要频繁地创建和销毁的对象,以减少系统性能开销。 单例模式的优点: ...

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

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

    设计模式 For iOS-02-单例模式

    单例模式是一种常用的软件设计模式,特别是在iOS开发中,它确保一个类仅有一个实例,并提供一个全局访问点。iOS SDK中广泛应用了单例模式,比如UIApplication和NSFileManager等类就是以单例形式存在。 在iOS开发中...

    单例设计模式--浅浅笔记

    单例设计模式是一种常用的设计模式,它主要用于控制类的实例化过程,确保在整个应用程序中,一个类只有一个实例存在。这种模式常被用于那些需要频繁创建和销毁,且资源消耗较大的对象,例如数据库连接、线程池或者...

    java常用设计模式-抽象工厂模式

    java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...

    单例模式----数据库连接池管理类的应用

    单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在IT行业中,尤其是在处理资源密集型任务如数据库连接时,单例模式被广泛应用。数据库连接池就是这种应用的一个典型例子。 ...

    IOS应用源码Demo-单例模式-毕设学习.zip

    在iOS应用开发中,单例模式是一种常用的编程设计模式,它确保了类只有一个实例,并提供一个全局访问点。这个模式在iOS开发中的应用非常广泛,特别是在处理系统资源、网络请求、数据存储等需要全局共享的对象时。在...

    JAVA常用设计模式-追美眉技术详解.doc

    ### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...

    23钟设计模式之单例模式

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

    java单例设计模式-饿汉式-懒汉式.docx

    Java中的单例设计模式是一种常用的设计模式,它确保一个类只有一个实例,并且提供一个全局访问点。单例模式常用于管理资源,如配置信息的读取,或者在系统中需要一个全局协调者的情况下。 单例设计模式有两大关键点...

    设计模式之单例模式.pptx

    单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...

    java单例设计模式-饿汉式-懒汉式 (2).docx

    单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点。这种模式在Java中有两种常见的实现方式:饿汉式和懒汉式。 1. 饿汉式单例: 饿汉式单例在类加载时就完成了初始化...

Global site tag (gtag.js) - Google Analytics