java中的singleton模式学习

    作者:课课家教育更新于: 2016-02-29 19:54:03

    大神带你学编程,欢迎选课

      或许最简单的设计范式就是“单子”(Singleton),它能提供对象的一个(而且只有一个)实例。单子在java库中得到了应用,但下面这个例子显得更直接一些:

    java中的singleton模式学习_java设计_java对象_课课家

      //: SingletonPattern.java

      // The Singleton design pattern: you can

      // never instantiate more than one.

      package c16;

      // Since this isn't inherited from a Cloneable

      // base class and cloneability isn't added,

      // making it final prevents cloneability from

      // being added in any derived classes:

      final class Singleton {

      private static Singleton s = new Singleton(47);

      private int i;

      private Singleton(int x) { i = x; }

      public static Singleton getHandle() {

      return s;

      }

      public int getValue() { return i; }

      public void setValue(int x) { i = x; }

      }

      public class SingletonPattern {

      public static void main(String[] args) {

      Singleton s = Singleton.getHandle();

      System.out.println(s.getValue());

      Singleton s2 = Singleton.getHandle();

      s2.setValue(9);

      System.out.println(s.getValue());

      try {

      // Can't do this: compile-time error.

      // Singleton s3 = (Singleton)s2.clone();

      } catch(Exception e) {}

      }

      } ///:~

      创建单子的关键就是防止客户程序员采用除由我们提供的之外的任何一种方式来创建一个对象。必须将所有构建器都设为private(私有),而且至少要创建一个构建器,以防止编译器帮我们自动同步一个默认构建器(它会自做聪明地创建成为“友好的”——friendly,而非private)。

      此时应决定如何创建自己的对象。在这儿,我们选择了静态创建的方式。但亦可选择等候客户程序员发出一个创建请求,然后根据他们的要求动态创建。不管在哪种情况下,对象都应该保存为“私有”属性。我们通过公用方法提供访问途径。在这里,getHandle()会产生指向Singleton的一个句柄。剩下的接口(getValue()和setValue())属于普通的类接口。

      Java也允许通过克隆(Clone)方式来创建一个对象。在这个例子中,将类设为final可禁止克隆的发生。由于Singleton是从Object直接继承的,所以clone()方法会保持protected(受保护)属性,不能够使用它(强行使用会造成编译期错误)。然而,假如我们是从一个类结构中继承,那个结构已经过载了clone()方法,使其具有public属性,并实现了Cloneable,那么为了禁止克隆,需要过载clone(),并掷出一个CloneNotSupportedException(不支持克隆违例),就象第12章介绍的那样。亦可过载clone(),并简单地返回this。那样做会造成一定的混淆,因为客户程序员可能错误地认为对象尚未克隆,仍然操纵的是原来的那个。

      注意我们并不限于只能创建一个对象。亦可利用该技术创建一个有限的对象池。但在那种情况下,可能需要解决池内对象的共享问题。如果不幸真的遇到这个问题,可以自己设计一套方案,实现共享对象的登记与撤消登记。

课课家教育

未登录