快速业务通道

Java模式设计之单例模式(四) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
模式使用了简单工厂模式(又称为静态工厂方法模式)来提供自己的实例。在上面ConfigManager 例子的代码中, 静态工厂方法getInstance() 就是静态工厂方法。在java.awt.Toolkit 类中,getDefaultToolkit() 方法就是静态工厂方法。简单工厂模式的简略类图如下所示。

Java模式设计之单例模式(四) - 编程入门网

Java模式设计之单例模式(四)(3)

时间:2010-12-14

本章讨论了单例模式的结构和实现方法。

单例模式是一个看上去很简单的模式,很多设计师最先学会的往往是单例模式。然而,随着Java 系统日益变得复杂化和分散化,单例模式的使用变得比过去困难。本书提醒读者在分散式的Java 系统中使用单例模式时,尽量不要使用有状态的。

问答题

1. 为什么不使用一个静态的“全程”原始变量,而要建一个类?一个静态的原始变量当然只能有一个值,自然而然不就是“单例”的吗?

2. 举例说明如何调用EagerSingleton 类。

3. 举例说明如何调用RegSingleton 类和RegSingletonChild 类。

4. 请问java.lang.Math 类和java.lang.StrictMath 类是否是单例模式?

5. 我们公司只购买了一个JDBC 驱动软件的单用户使用许可,可否使用单例模式管理通过JDBC 驱动软件连接的数据库?

问答题答案

1. 单例模式可以提供很复杂的逻辑,而一个原始变量不能自已初始化,不可能有继承的关系,没有内部结构。因此单例模式有很多优越之处。

在Java 语言里并没有真正的“全程”变量,一个变量必须属于某一个类或者某一个实例。而在复杂的程序当中,一个静态变量的初始化发生在哪里常常是一个不易确定的问题。当然,使用“全程”原始变量并没有什么错误,就好像选择使用Fortran 语言而非Java语言编程并不是一种对错的问题一样。

2. 几种单例类的使用方法如下。

代码清单11:几种单例类的使用方法

public class RegSingletonTest { public static void main(String[] args) { //(1) Test eager System.out.println( EagerSingleton.getInstance()); //(2) Test reg System.out.println( RegSingleton.getInstance( "com.javapatterns.singleton.demos.RegSingleton").about()); System.out.println( RegSingleton.getInstance(null).about() ); System.out.println( RegSingleton.getInstance( "com.javapatterns.singleton.demos.RegSingletonChild").about()); System.out.println( RegSingletonChild.getInstance().about()); } }

3. 见上题答案。

4. 它们都不是单例类。原因如下:

这两个类均有一个私有的构造子。但是这仅仅是单例模式的必要条件,而不是充分条件。回顾在本章开始提出的单例模式的三个特性可以看出,无论是Math 还是StrictMath 都没有为外界提供任何自身的实例。实际上,这两个类都是被设计来提供静态工厂方法和常量的,因此从来就不需要它们的实例,这才是它们的构造子是私有的原因。Math和StrictMath 类的类图如下所示。

Java模式设计之单例模式(四) - 编程入门网

5. 这样做是可行的,只是必须注意当使用在分散式系统中的时候,不一定能保证单例类实例的惟一性。

Java模式设计之单例模式(四)(4)

时间:2010-12-14

附录:双重检查成例的研究

成例是一种代码层次上的模式,是在比设计模式的层次更具体的层次上的代码技巧。成例往往与编程语言密切相关。双重检查成例(Double Check Idiom )是从C 语言移植过来的一种代码模式。在C 语言里,双重检查成例常常用在多线程环境中类的晚实例化(Late Instantiation)里。

本节之所以要介绍这个成例(严格来讲,是介绍为什么这个成例不成立), 是因为有很多人认为双重检查成例可以使用在“懒汉”单例模式里面。

什么是双重检查成例

为了解释什么是双重检查成例,请首先看看

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号