`

Singleton的几种形式

阅读更多
Singleton能确保某一个类只有一个实例。

饿汉式:被加载时即实例化,从资源利用效率来看,较懒汉式稍差;从速度和反应时间看,较懒汉式稍好些。它不能在C++内实现。
EagerSingleton.java

java 代码
 
  1. public class EagerSingleton{  
  2. //私有field,并实自身例化  
  3.     private static final EagerSingleton instance=new EagerSingleton();  
  4. /* 
  5. *   私有构造子,确保外界不能实例化。同时意味着它不能被子类继承。 
  6. */  
  7.     private EagerSingleton(){}  
  8. /* 
  9. *   静态工厂方法,返回此类的实例 
  10. */  
  11.     public static EagerSingleton getInstance(){  
  12.         return this.instance;  
  13.     }  
  14. /* 
  15. *   示意商业逻辑 
  16. */  
  17.     public void about(){  
  18.         System.out.println("This is the EagerSingleton pattern.");  
  19.     }  
  20. }  

懒汉式:如果加载器是静态的,被加载时不会将自己实例化,直到第一次引用时才实例化(即getInstance()时)。它能在C++内实现。
LazySingleton.java
java 代码
  1. public class LazySintleton{  
  2. //私有的field,设为null  
  3.     private static final LazySintleton instance=null;  
  4. /* 
  5. *   私有构造子,确保外界不能实例化。同时意味着它不能被子类继承。 
  6. */  
  7.     private LazySintleton(){}  
  8. /* 
  9. *   静态工厂方法,返回此类的实例 
  10. */  
  11.     public static LazySintleton getInstance(){  
  12.         if(instance==null){
  13.              instance=new LazySingleton();
  14.         }
  15.         return this.instance;  
  16.     }  
  17. /* 
  18. *   示意商业逻辑 
  19. */  
  20.     public void about(){  
  21.         System.out.println("This is the LazySingleton pattern.");  
  22.     }  
  23. }  

值得注意的是,懒汉式在多线程的环境下需要考虑解决线程安全的问题。
下面做些修改

  1. public class LazySintleton{  
  2. //私有的field,设为null  
  3.     private static final LazySintleton instance=null;  
  4. /* 
  5. *   私有构造子,确保外界不能实例化。同时意味着它不能被子类继承。 
  6. */  
  7.     private LazySintleton(){}  
  8. /* 
  9. *   静态工厂方法,返回此类的实例
  10. *   在多线程下加个管程(方法声名中使用synchronized关键字)
  11. */ 
  12.     public static synchronized LazySintleton getInstance(){
  13.         if(instance==null){
  14.              instance=new LazySingleton();
  15.         }
  16.         return this.instance;  
  17.     }  
  18. /* 
  19. *   示意商业逻辑 
  20. */  
  21.     public void about(){  
  22.         System.out.println("This is the LazySingleton pattern.");  
  23.     }  


登记式:GoF为克服懒汉式单例类不能继承的缺点而设计的。注意此处的父类与子类的实现。
RegSingleton.java
java 代码
 
  1. import java.util.HashMap;  
  2. public class RegSingleton{  
  3.     static private HashMap registry=new HashMap();  
  4.     static {  
  5.         RegSingleton x=new RegSingleton();  
  6.         registry.put(x.getClass().getName(),x);  
  7.     }  
  8.     /* 
  9.      *保护的构造子 
  10.      */  
  11.     protected Regsingleton(){}  
  12.       
  13.     /** 
  14.      *静态工厂方法,返还此类唯一的实例 
  15.      */  
  16.     public static RegSingleton getInstance(String name){  
  17.         if(name==null){  
  18.             name="RegSingleton";  
  19.         }  
  20.         if(registry.get(name)==null){  
  21.             try{  
  22.                 registry.put(Class.forName(name).newInstance());  
  23.             }  
  24.             catch(Exception e){  
  25.                 System.out.println ("Error:" +e.toString());                  
  26.             }  
  27.         }  
  28.         return (RegSingleton)(registry.get(name));  
  29.     }  
  30.     /** 
  31.      *示意性商业逻辑 
  32.      */  
  33.     public void about(){  
  34.         System.out.println ("This is a base Class of RegSingleton ");  
  35.     }  
  36. }  
子类的实现
RegSingletonChild.java
java 代码
 
  1. import java.util.HashMap;  
  2. public class RegSingletonChild extends RegSingleton{  
  3.     public RegSingleChild(){}  
  4.     /** 
  5.      *静态工厂方法 
  6.      */  
  7.      public static RegSingletonChild getInstance(){  
  8.         return(RegSingleChild)RegSingleton.getInstance("RegSingletonChild");  
  9.      }  
  10.      /** 
  11.       *示意性商业逻辑 
  12.       */  
  13.       public void about(){  
  14.         System.out.println ("This is the child Class extends from RegSingleton class.")  
  15.       }  
  16. }  

一个用内部类实现的Singleton,由Jeremy Manson和Brian Goetx于2004年发布。
Singleton.java
java 代码
 
  1. public class Singleton{  
  2.     /** 
  3.      *通过内部类实例化 
  4.      */  
  5.     static class SingletonHolder{  
  6.         static Singleton instance=new Singleton();  
  7.     }  
  8.     private Singleton(){}  
  9.       
  10.     public static Singleton getInstance(){  
  11.         return SingletonHolder.instance;  
  12.     }  
  13.     public void about(){  
  14.         System.out.println ("test...");  
  15.     }  
  16. }  

在任何使用了EJB、RMI、JINI技术的分散式系统中,应当避免使用有状态的单例。
Edit[2007-4-9]
参考自《java与模式》阎宏。
《java与模式》是本不可多得的好书,值得珍藏!
分享到:
评论

相关推荐

    singleton.zip单例的几种实现demo,

    在"singleton.zip"压缩包中,我们可能会找到几种不同的Java单例实现方式的示例代码,包括饿汉式、懒汉式、反射实现以及内部类实现等。以下是对这些单例模式实现方式的详细解释: 1. **饿汉式(Eager Initialization...

    (创建型模式)Singleton模式

    下面我们将详细介绍Singleton模式的几种常见实现方式: 1. 饿汉式(静态常量): 在类加载时就完成了初始化,因此这种方法是线程安全的。但是,由于类加载较早,即使尚未使用Singleton,也会创建实例,造成内存...

    Singleton pattern单例模式应用

    除了上述提到的饿汉式和懒汉式单例模式外,还有其他几种实现方式,如枚举单例、内部类单例等,每种方式都有其适用场景和优劣。 #### 结论 单例模式作为软件工程中的一种基本设计模式,其核心在于控制类的实例化...

    Java的Singleton模式代码(免资源分)

    接下来,我们将详细探讨几种常见的Singleton实现方式及其优缺点。 #### 二、经典实现方式:饿汉式 **代码示例:** ```java public class Singleton { // 私有构造函数,防止外部实例化 private Singleton() {} ...

    Loki singleton

    在软件工程中,单例模式是一种常用的创建对象的方式,确保一个类只有一个实例,并提供一个全局访问点。这在需要频繁实例化然后销毁的对象,或者创建开销大的对象时特别有用。 Loki 库中的 Singleton 模板类提供了...

    Java线程安全的Singleton模式:深入分析与实现

    本文将详细介绍如何在Java中创建线程安全的Singleton,包括几种常见的实现方式和最佳实践。 在Java中创建线程安全的Singleton模式是一项重要的任务,尤其是在多线程环境中。通过使用饿汉式、懒汉式与双重检查锁定、...

    Singleton模式源程序

    解决这个问题的方法有几种: 1. 静态初始化:在C++中,静态数据成员的初始化是线程安全的。因此,如果Singleton实例在类声明时就初始化,可以避免线程冲突。但是,这种方式可能导致初始化顺序问题,如果Singleton...

    17-SingleTon.rar

    在Java中实现单例模式主要有以下几种方式: 1. 饿汉式(静态常量) 这是最简单的单例实现方式,通过静态常量在类加载时就完成初始化,确保线程安全。 ```java public class Singleton { private static final ...

    Singleton 单例模式的介绍以及解析

    为了解决这个问题,我们可以采用以下几种策略: 1. **懒汉式(线程不安全)**:在首次调用时才初始化单例,但这种方式在多线程环境下可能不安全。两个线程可能同时进入if语句块,分别创建单例,从而产生多个实例。 ...

    Singleton单例模式.zip

    通常,我们通过以下几种方式来实现C#中的单例模式: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,所以是线程安全的。 ```csharp public sealed class Singleton { private static readonly ...

    最简单的设计模式学习Singleton模式

    为了实现这一目标,通常会采用以下几种方法: 1. **私有构造函数**:将构造函数设置为私有,防止外部通过new关键字创建对象。 2. **静态成员变量**:利用静态成员变量来存储Singleton的唯一实例。 3. **静态工厂...

    Singleton模式

    Singleton模式的实现主要有以下几种: 1. **饿汉式(Eager Initialization)**:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private ...

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

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

    linux下线程安全的singleton模板

    为了解决这个问题,我们可以采用以下几种策略来确保线程安全: 1. **静态内部类**:这是Java中的一种常见实现方式,但在C++中不适用。不过,这个概念可以借鉴,通过将Singleton的实例化过程延迟到首次访问时,利用...

    单例模式的几种实现方式demo

    下面我们将深入探讨单例模式的几种实现方式。 ### 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此是线程安全的。代码如下: ```java public class Singleton { private static final ...

    单例模式的几种实现方式

    下面将详细介绍单例模式的几种常见实现方式。 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此线程安全。这种方式简单且效率高,但如果单例对象不被使用,会造成内存浪费。 ```java public class...

    JAVA中单例模式的几种实现方式.doc

    ### JAVA中单例模式的几种实现方式 #### 1. 线程非安全的基本实现方式 单例模式是设计模式中的一种常用形式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过多种方式来...

    singleton_单例模式_java_设计模式_

    在Java中,单例模式的实现通常有以下几种方式: 1. 饿汉式(Static Inner Class Singleton): 这种方法在类加载时就完成了初始化,所以是线程安全的。它通过将单例类的构造函数设置为私有,并在内部类中创建一个...

    几种单例模式

    接下来,我们将深入探讨几种常见的单例模式实现方式。 ### 1. 饿汉式(静态常量) ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} ...

    几种单例模式demo

    单例模式的实现方式有很多种,下面我们将详细探讨几种常见的单例模式的实现方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private ...

Global site tag (gtag.js) - Google Analytics