Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1567870
  • 博文数量: 237
  • 博客积分: 5139
  • 博客等级: 大校
  • 技术积分: 2751
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-18 14:48
文章分类

全部博文(237)

文章存档

2016年(1)

2012年(4)

2011年(120)

2010年(36)

2009年(64)

2008年(12)

分类: 嵌入式

2011-06-16 11:19:37

Java Singleton 模式(单身模式,单态模式)是一种创建型设计模式。用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在。
 Java Singleton 模式(单身模式,单态模式)是一种创建型设计模式。用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在。在 web 程序中我们会用一个核心的分配功能的Servlet程序,在这里我们就可以运用这种设计模式了。 

  一般Singleton模式通常有几种种形式: 

  第一种形式: 

  定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例化,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 

  public class Singleton { 

  private Singleton(){} 

  // 在自己内部定义自己一个实例,是不是很奇怪? 

  // 注意这是private 只供内部调用 

  private static Singleton instance = new Singleton(); 

  // 这里提供了一个供外部访问本class的静态方法,可以直接访问 

  public static Singleton getInstance() { 

  return instance; 

  } 

  } 


  第二种形式: 

  public class Singleton{ 

  private static Singleton instance=null; 

  public static Singleton getInstance(){ 

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 

  //使用时生成实例,提高了效率! 

  if(instance==null) 

  instance=new Singleton(); 

  return instance; 

  } 

  } 


  其他形式: 

  定义一个类,它的构造函数为private的,所有方法为static的。 

  一般认为第一种形式要更加安全些

 

如何使用Java Singleton模式
2008-09-20 17:07

Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。
如果实例不存在,你通过创建类的新实例的方法建立一个类来执行这个模式;如果存在类的一个实例,就只会返回那个对象的一个引用。

Singleton模式的运行机制

以下是Singleton模式的一个典型例子:

public class Singleton {

        private final static Singleton INSTANCE = new Singleton();

    // Private constructor suppresses generation of

    // a (public) default constructor

    private Singleton() {}

    public static Singleton getInstance() {

      return INSTANCE;

    }

}

标准的Singleton模式并不使用直接静态变量实例化进行声明——它实例化构造器中的一个静态实例变量,而不查看它是否已经存在:

public class ClassicSingleton {

    private static ClassicSingleton INSTANCE = null;

    private ClassicSingleton() {

       // Exists only to defeat instantiation.

    }

    public static ClassicSingleton getInstance() {

       if(INSTANCE == null) {

          INSTANCE = new ClassicSingleton();

       }

       return INSTANCE;

    }

}

Singleton类的默认构造器被设为私有,这样做可防止其它类使用new关键字直接将对象实例化。对返回Singleton对象的实例方法应用一个静态修饰符,这使得它成为一个类级方法,不创建对象即可进行访问。

何时需要使用Singleton

当你只需要一个类实例时,Singleton才真正有用;如果类拥有几个实例,使用Singleton就不再适用。

设计系统时,你通常希望控制对象的用法,防止用户(包括你自己)复制对象或建立新实例。例如,你可以使用它创建一个连接池。每次程序需要往数据库中写入内容时才创建一个新连接的做法并不明智;相反,一个或一组已经在池中的连接就可以使用Singleton模式实例化。

Singleton模式常常和工厂方法模式一同使用,创建一个系统级资源,使用这个资源的代码并不知道它的特殊类型。抽象窗口工具包(AWT)就是组合使用这两个模式的典型例子。在GUI应用程序中,对每个应用程序实例,你一般只需要一个图形元素的实例,如打印(Print)对话框或OK按钮。

注意潜在的问题

虽然Singleton设计模式是最简单的设计模式之一,但它也存在一些缺陷。

多线程应用程序中的构造问题

在多线程应用程序中,你必须仔细构造Singleton模式。当Singleton不存在时,如果两个线程即将同时执行创建方法,这两个线程必须检查Singleton实例,但只有一个线程应当创建新对象。这个问题的典型解决办法就是对类使用相互排斥,指出对象正在被实例化。这是Singleton的一个线程安全的版本:

public class Singleton

{

   // Private constructor suppresses generation

   // of a (public) default constructor

   private Singleton() {}

   private static class SingletonHolder

   {

     private final static Singleton INSTANCE = new Singleton();

   }

   public static Singleton getInstance()

   {

     return SingletonHolder.INSTANCE;

   }

}

另一个解决办法是在getInstance()方法声明中添加synchronized关键字:

public static synchronized Singleton getInstance()

提前考虑克隆预防

你仍然可以使用对象的clone()方法克隆对象,建立一个Singleton对象。要禁用这一功能,你需要禁用对象的克隆方法,这产生一个CloneNotSupportedException例外。

      public Object clone() throws

CloneNotSupportedException {

         throw new CloneNotSupportedException();

}

考虑使singleton类位于最后

你可能希望将Singleton类放在最后,以避免Singleton的子类造成其它问题。

不要忘记垃圾收集

根据不同的执行,你的Singleton类和它的所有数据可能被当作垃圾收集。因此,在应用程序运行时,你必须保证存在一个Singleton类的实时引用。

结论

Singleton模块得到广泛地使用,并证实可用于软件设计。虽然这个模式并非Java专有,但它已成为Java编程的一个典型应用。尽管这个模式相当简单,但还是要记住我在本文中描述的Singleton模式的限制。

JAVA基础(singleton的几种实现方式)
1.Eager
  public class EagerInitialization {
  private static Resource resource = new Resource();
  public static Resource getResource() {
  return resource;
  }
  static class Resource {
  }
  }
  2.Lazy
  public class SafeLazyInitialization {
  private static Resource resource;
  public synchronized static Resource getInstance() {
  if (resource == null)
  resource = new Resource();
  return resource;
  }
  static class Resource {
  }
  }
  3.double checked locking singleton ( 仅适用于java 5.0 以上版本)
  public class DoubleCheckedLockingSingleton {
  //java5.0 修改了内存模型, 可以保证使用volatile 声明的变量对于double checked locking是正确的
  private volatile static DoubleCheckedLockingSingleton uniqueInstance;
  private DoubleCheckedLockingSingleton() {}
  public static DoubleCheckedLockingSingleton getInstance() {
  if (uniqueInstance == null) {
  synchronized (DoubleCheckedLockingSingleton.class) {
  if (uniqueInstance == null) {
  uniqueInstance = new DoubleCheckedLockingSingleton();
  }
  }
  }
  return uniqueInstance;
  }
  }
  4.Lazy initialization holder class idiom
  public class ResourceFactory {
  //增加一个helper类来初始化对象
  private static class ResourceHolder {
  public static Resource resource = new Resource();
  }
  public static Resource getResource() {
  return ResourceFactory.ResourceHolder.resource;
  }
  static class Resource {
  }
  }
  以上四种方法都是线程安全的实现方式。
什么是Singleton呢?

In software engineering, the singleton pattern is a design pattern that is used to restrict instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. Sometimes it is generalized to systems that operate more efficiently when only one or a few objects exist. It is also considered an anti-pattern since it is often used as a euphemism for global variable.
阅读(718) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~