知识大全 在Java中应用设计模式Singleton

Posted

篇首语:黄沙百战穿金甲,不破楼兰终不还。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Java中应用设计模式Singleton相关的知识,希望对你有一定的参考价值。

在Java中应用设计模式Singleton  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

          基本概念

  Singleton 是一种创建性模型 它用来确保只产生一个实例 并提供一个访问它的全局访问点 对一些类来说 保证只有一个实例是很重要的 比如有的时候 数据库连接或 Socket 连接要受到一定的限制 必须保持同一时间只能有一个连接的存在 再举个例子 集合中的 set 中不能包含重复的元素 添加到set里的对象必须是唯一的 如果重复的值添加到 set 它只接受一个实例 JDK中正式运用了Singleton模式来实现 set 的这一特性 大家可以查看java util Collections里的内部静态类SingletonSet的原代码 其实Singleton是最简单但也是应用最广泛的模式之一 在 JDK 中随处可见

  简单分析

  为了实现 Singleton 模式 我们需要的是一个静态的变量 能够在不创建对象的情况下记忆是否已经产生过实例了 静态变量或静态方法都可以在不产生具体实例的情况下直接调用 这样的变量或方法不会因为类的实例化而有所改变 在图 的结构中可以看到 uniqueInstance 就是这个独立的静态变量 它可以记忆对象是否已经实例化了 在静态方法 Instance 中对这个变量进行判断 若没有实例化过就产生一个新的对象 如果已经实例化了则不再产生新的对象 仍然返回以前产生的实例

  图 : Singleton 模式结构

  

    具体实施

  实现 Singleton 模式的办法通常有三种

  一 用静态方法实现 Singleton 这种方法是使用静态方法来监视实例的创建 为了防止创建一个以上的实例 我们最好把构造器声明为 private

  这样可以防止客户程序员通过除由我们提供的方法之外的任意方式来创建一个实例 如果不把构造器声明为private 编译器就会自作聪明的自动同步一个默认的friendly构造器 这种实现方法是最常见的 也就是图 中结构的标准实现

public class Singleton   private static Singleton s;   private Singleton();   /**   * Class method to access the singleton instance of the class   */   public static Singleton getInstance()   if (s == null)   s = new Singleton();   return s;         // 测试类   class singletonTest   public static void main(String[] args)   Singleton s = Singleton getInstance();   Singleton s = Singleton getInstance();   if (s ==s )   System out println( s is the same instance with s );   else   System out println( s is not the same instance with s );      

  singletonTest运行结果是:

  s is the same instance with s

  这证明我们只创建了一个实例

  二 以静态变量为标志实现 Singleton 在类中嵌入一个静态变量做为标志 每次都在进入构造器的时候进行检查

  问题在于构造器没有返回类型 如果确定创建一个实例成功与否 一个方法是调用一个函数来检查创建是否成功 然后简单的返回一个来自静态变量的值 但是这样做是不优雅的 而且容易发生错误 比较好的做法是创建一个当创建了一个以上的实例时可以抛出异常的类 这个类仅仅是调用父类方法 好处是用了自己命名的异常类型 错误信息更加清晰:

class SingletonException extends RuntimeException   public SingletonException(String s)   super(s);         class Singleton   static boolean instance_flag = false; // true if instance   public Singleton()   if (instance_flag)   throw new SingletonException( Only one instance allowed );   else   instance_flag = true; // set flag for instance         // 测试类   public class singletonTest   static public void main(String argv[])   Singleton s s ;   // create one incetance this should always work   System out println( Creating one instance );   try   s = new Singleton();    catch (SingletonException e)   System out println(e getMessage());      // try to create another spooler should fail   System out println( Creating o instance );   try   s = new Singleton();    catch (SingletonException e)   System out println(e getMessage());         

  singletonTest运行结果是:

  Creating one instance

  Creating o instance

  Only one instance allowed

  可以看出 第一个实例顺利创建 第二个实例创建实抛出了我们自定义的异常

  三 用注册器机制来创建 Singleton 首先用集合中的Hashtable 和Enumeration来实现addItem(Object key Object value) getItem(Object key) removeItem(Object key)等方法实现一个管理器 将key和value一一关联起来 客户程序员创建实例前首先用addItem方法进行注册 再用getItem方法获取实例 Hashtable中的key是唯一的 从而保证创建的实例是唯一的 具体实现限于篇幅不再细说 在Prototype模型的应用一文中我将会给出一个实现注册器的代码 用注册器机制来创建 Singleton模式的好处是易于管理 可以同时控制多个不同类型的Singleton 实例

  小结

  Singleton模式可以方便的进行扩充 产生指定数目的实例

  在The Design Patterns Java Companion 一书中曾提到过用静态类的方式来实现 Singleton模式 并指出java lang Math就是一个例子 这里我并不表示赞同 因为Math并不是一个真正的对象 我们只是直接调用Math类所包装的静态方法而已 根本就没有创建实例的过程 又从何说起只产生一个实例呢?这个问题我曾到Javaranch的论坛上发过帖子 所有回帖的人也都是对这一观点持否定态度

  在多线程的程序中 singleton可能会变的不可靠 可能会出现多个实例 解决的办法很简单 加个同步修饰符: public static synchronized Singleton getInstance() 这样就保证了线程的安全性

cha138/Article/program/Java/gj/201311/27404

相关参考

知识大全 23种设计模式的Java版--Singleton(单例)

23种设计模式的Java版--Singleton(单例)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 单件模式singleton的理解

  Singleton模式是一个较为简单的模式下面的代码就可以建立一个Singlton模式的例子这是一个写系统日志的类实际应用的意义在于在内存中只保存一个实例避免开辟多个功能相同的工具类实例而耗用系统

知识大全 在Java中应用State设计模式

在Java中应用State设计模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对象的状态由各

知识大全 Singleton模式

最简单的设计模式学习:Singleton模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  学习

知识大全 设计模式之Singleton(单态模式)

设计模式之Singleton(单态模式)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要讨论

知识大全 Singleton设计模式的C#实现

Singleton设计模式的C#实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Singleto

知识大全 php设计模式之单例、多例设计模式的应用分析

本篇文章是对php设计模式中的单例与多例设计模式的应用进行了详细的分析介绍需要的朋友参考下   单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量如

知识大全 .Net 单例模式(Singleton)

.Net单例模式(Singleton)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!单例模式的意思

知识大全 C# “Singleton” 模式四种实现方法

C#“Singleton”模式四种实现方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大家一

知识大全 从C#的Singleton设计模式实现看.NETFramework特性对开发者的重要性

从C#的Singleton设计模式实现看.NETFramework特性对开发者的重要性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布