Java模式设计之单例模式(四) - 编程入门网
模式使用了简单工厂模式(又称为静态工厂方法模式)来提供自己的实例。在上面ConfigManager 例子的代码中, 静态工厂方法getInstance() 就是静态工厂方法。在java.awt.Toolkit 类中,getDefaultToolkit() 方法就是静态工厂方法。简单工厂模式的简略类图如下所示。
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:几种单例类的使用方法
3. 见上题答案。 4. 它们都不是单例类。原因如下: 这两个类均有一个私有的构造子。但是这仅仅是单例模式的必要条件,而不是充分条件。回顾在本章开始提出的单例模式的三个特性可以看出,无论是Math 还是StrictMath 都没有为外界提供任何自身的实例。实际上,这两个类都是被设计来提供静态工厂方法和常量的,因此从来就不需要它们的实例,这才是它们的构造子是私有的原因。Math和StrictMath 类的类图如下所示。 5. 这样做是可行的,只是必须注意当使用在分散式系统中的时候,不一定能保证单例类实例的惟一性。 Java模式设计之单例模式(四)(4)时间:2010-12-14附录:双重检查成例的研究 成例是一种代码层次上的模式,是在比设计模式的层次更具体的层次上的代码技巧。成例往往与编程语言密切相关。双重检查成例(Double Check Idiom )是从C 语言移植过来的一种代码模式。在C 语言里,双重检查成例常常用在多线程环境中类的晚实例化(Late Instantiation)里。 本节之所以要介绍这个成例(严格来讲,是介绍为什么这个成例不成立), 是因为有很多人认为双重检查成例可以使用在“懒汉”单例模式里面。 什么是双重检查成例 为了解释什么是双重检查成例,请首先看看 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |