`

Java 单例模式

    博客分类:
  • Java
阅读更多
JAVA单例模式的几种实现方法默认分类 2008-12-27 11:04:49 阅读3111 评论0 字号:大中小
1 饿汉式单例类.在类初始化时,已经自行实例化


class EagerSingleton {   
  private static final EagerSingleton m_instance = new EagerSingleton();   
  
  /** * 私有的默认构造子 */  
  private EagerSingleton() {   
   }   
  
  /**
    * * 静态工厂方法
    */  
  public static EagerSingleton getInstance() {   
    return m_instance;   
   }   
}  
2 懒汉式单例类.在第一次调用的时候实例化

class LazySingleton {   
  // 注意,这里没有final   
  private static LazySingleton m_instance = null;   
  
  /** * 私有的默认构造子 */  
  private LazySingleton() {   
   }   
  
  /**
    * * 静态工厂方法
    */  
  public synchronized static LazySingleton getInstance() {   
    if (m_instance == null) {   
       m_instance = new LazySingleton();   
     }   
    return m_instance;   
   }   
}  
在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里

建议使用所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java 语言中使用。不十分熟

悉的读者,可以看看后面给出的小节。

  同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例

化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,

这个比懒汉式单例类稍差些。

  从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处

理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必

然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变

得较大。

  饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定

的顺序,因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么

GoF 在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子

也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java 语言本身的特点。



3 登记式单例类.类似Spring里面的方法,将类名注册,下次从里面直接获取。 查看复制到剪切板打印
import java.util.HashMap;   
  
class RegSingleton {   
  static private HashMap m_registry = new HashMap();   
  static {   
     RegSingleton x = new RegSingleton();   
     m_registry.put(x.getClass().getName(), x);   
   }   
  
  /** * 保护的默认构造子 */  
  protected RegSingleton() {   
   }   
  
  /** * 静态工厂方法,返还此类惟一的实例 */  
  static public RegSingleton getInstance(String name) {   
    if (name == null) {   
       name = RegSingleton.class.getName();   
     }   
    if (m_registry.get(name) == null) {   
      try {   
         m_registry.put(name, Class.forName(name).newInstance());   
       } catch (Exception e) {   
         System.out.println("Error happened.");   
       }   
      return (RegSingleton) (m_registry.get(name));   
     }   
    return null;   
   }   
  
  /** * 一个示意性的商业方法 */  
  public String about() {   
    return "Hello, I am RegSingleton.";   
   }   
}   
  
class RegSingletonChild extends RegSingleton {   
  public RegSingletonChild() {   
   }   
  
  /** * 静态工厂方法 */  
  static public RegSingletonChild getInstance() {   
    return (RegSingletonChild) RegSingleton.getInstance

("com.javapatterns.singleton.demos.RegSingletonChild");   
   }   
  
  /** * 一个示意性的商业方法 */  
  public String about() {   
    return "Hello, I am RegSingletonChild.";   
   }   
}  

分享到:
评论

相关推荐

    Java 单例模式.pptx

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

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    使用Java单例模式实现一个简单的日志记录器.txt

    ### 使用Java单例模式实现一个简单的日志记录器 #### 一、单例模式简介 单例模式是一种常用的软件设计模式,在该模式中,一个类只能创建一个实例,并且提供了一个全局访问点来访问该实例。单例模式的主要优点包括...

    Java 单例模式 懒汉模式

    Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象

    Java 单例模式 工具类

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

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    Java单例模式设计

    Java单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。这种模式在需要频繁创建和销毁对象的场景中,或者当对象昂贵时(如数据库连接),能够节省系统资源,提高效率。本篇文章将深入探讨...

    java单例模式及实现

    Java单例模式及实现 Java单例模式是一种常见的设计模式,确保某一个类只有一个实例,而且向这个系统提供这个实例。单例模式可以分为三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式的要点 1. 某个类只能有...

    Java单例模式深入理解

    Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...

    Java单例模式应用研究.pdf

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

    java单例模式的例子

    Java单例模式是一种常见的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面应用广泛。下面我们将深入探讨Java单例...

    java单例模式连接数据库源码

    Java单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在数据库连接管理中,使用单例模式能有效控制资源,避免频繁创建和关闭数据库连接导致的性能损失和资源浪费。以下是对Java单例模式...

    java单例模式代码实例

    Java单例模式是一种常用的设计模式,它用于保证一个类只有一个实例,并提供全局访问点。这种模式在系统资源有限或者需要共享昂贵对象时尤其有用,比如数据库连接池、线程池等。下面我们将深入探讨Java单例模式的实现...

    java 单例模式(懒汉式与饿汉式).docx

    java 单例模式(懒汉式与饿汉式) java 单例模式是一种常用的软件设计模式。在它的可信结构中只包含一个被实例化单例的特别类。通过单例设计模式可以把整系统中的一个类只有一个实例。单例设计模式又分为两种方式,...

    Java单例模式.pdf

    Java单例模式是设计模式中的一种,在软件开发中扮演着重要的角色。单例模式的目的是保证一个类仅有一个实例,并且提供一个全局访问点。在Java中实现单例模式有多种方法,主要包括懒汉式、饿汉式、注册式(使用容器)...

Global site tag (gtag.js) - Google Analytics