`
oywl2008
  • 浏览: 1014597 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在 Java 中应用设计模式 -- Singleton

 
阅读更多

本文介绍了设计模式中 Singleton 的基本概念,对其功能和用途进行了简单的分析,列出了通常实现 Singleton 的几种方法,并给出了详细的Java 代码.

 

基本概念

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

 

简单分析

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

 

具体实施

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

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

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

 

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

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

 

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

小结

  1. Singleton模式可以方便的进行扩充,产生指定数目的实例.
  2. 在The Design Patterns Java Companion 一书中曾提到过用静态类的方式来实现 Singleton模式,并指出java.lang.Math就是一个例子,这里我并不表示赞同,因为Math并不是一个真正的对象,我们只是直接调用Math类所包装的静态方法而已,根本就没有创建实例的过程,又从何说起只产生一个实例呢?这个问题我曾到Javaranch的论坛上发过帖子,所有回帖的人也都是对这一观点持否定态度.
  3. 在多线程的程序中,singleton可能会变的不可靠,可能会出现多个实例,解决的办法很简单,加个同步修饰符: public static synchronized Singleton getInstance(). 这样就保证了线程的安全性.
  4. 最后要说的是大家可能会看见一些其他实现Singleton模式的方法,因为模式在具体的应用时是灵活的,不是一成不变的,并没有一个固定的做法,但大都是上面几种方法的变形.
<!--CMA ID: 53403--><!--Site ID: 10--><!--XSLT stylesheet used to transform this file: dw-document-html-7.0.xsl-->

http://www.ibm.com/developerworks/cn/java/designpattern/singleton/

 

分享到:
评论

相关推荐

    java面试题目与技巧1

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    java面试题及技巧4

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    java面试题以及技巧

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    java面试题及技巧3

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    java面试题以及技巧6

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    Java EE设计模式:Spring企业级开发最佳实践

    Java EE 设计模式是指在 Java 企业版(Java Enterprise Edition)中应用的设计模式,旨在提高软件系统的可维护性、可扩展性和可重用性。Spring 是当前最流行的 Java EE 框架之一,广泛应用于企业级开发中。 在 Java...

    ava常用设计模式-单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式有多种实现...

    java 23种设计模式及具体例子

    java 中的 23 种设计模式可以分为三大类:创建型模式、结构型模式、行为型模式。每种模式都有其特点和应用场景。 1. 工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态...

    Java面试题-设计模式+设计原则+代理.pdf

    "Java面试题-设计模式+设计原则+代理...本文总结了设计模式、代理模式和设计原则在 Java 中的应用,以及它们的优点和缺点。了解这些知识点对于Java开发者来说非常重要,可以帮助他们编写更加健壮、灵活和可维护的代码。

    Java 23种设计模式全归纳

    本资源包汇总了Java中23种经典设计模式的详细介绍和使用示例,旨在帮助开发者系统性地学习和掌握设计模式在软件开发中的应用。这些设计模式分为三大类:创建型模式、结构型模式和行为型模式,每种模式都包括定义、...

    人人都懂设计模式 人人都懂设计模式

    在“进阶篇”中,作者讲解了设计模式在实际开发中的应用,包括过滤器模式、对象池技术、回调机制和 MVC 模式等。在“经验篇”中,作者分享了自己在设计模式和软件开发方面的经验和看法,包括设计原则、项目重构等。 ...

    设计模式之Singleton 模式.docx

    描述设计模式之Singleton 模式的应、及举例说明了在JAVA中单利模式的具体应用。

    研磨设计模式-part2

    《研磨设计模式》在内容上深入、技术上实用、和实际开发结合程度很高,书中大部分的示例程序都是从实际项目中简化而来,因此很多例子都可以直接拿到实际项目中使用。如果你想要深入透彻地理解和掌握设计模式,并...

    研磨设计模式-part4

    《研磨设计模式》在内容上深入、技术上实用、和实际开发结合程度很高,书中大部分的示例程序都是从实际项目中简化而来,因此很多例子都可以直接拿到实际项目中使用。如果你想要深入透彻地理解和掌握设计模式,并...

    研磨设计模式-part3

    《研磨设计模式》在内容上深入、技术上实用、和实际开发结合程度很高,书中大部分的示例程序都是从实际项目中简化而来,因此很多例子都可以直接拿到实际项目中使用。如果你想要深入透彻地理解和掌握设计模式,并...

    J2EE相关设计模式23种Java设计模式

    23种Java设计模式.txt J2EE相关设计模式讨论.txt Java设计模式.doc Singleton 模式在 Java 中的应用.txt

    Java 23种设计模式通解

    设计模式是软件工程的基石,它们被广泛应用于软件开发中,以提高代码的可重用性、可读性和可维护性。 设计模式的分类: * 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 * 结构...

    design-pattern-java.pdf

    设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计...

    JAVA设计模式(单态模式和简单工厂模式)

    Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在项目的很多地方都会用到它,比如说数据库的链接。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于...

    Java23种设计模式

    "Java23种设计模式" ...Java设计模式的应用非常广泛,包括但不限于:数据库设计、网络编程、用户界面设计等领域。掌握Java设计模式可以帮助开发者更好地设计和实现软件系统,提高软件的可维护性、灵活性和可重用性。

Global site tag (gtag.js) - Google Analytics