您的位置:软件 > 开发者网络 > 开发工具 > Java > 正文
Java模式设计之单例模式(三)
[文章信息]
作者:阎宏
时间:2003-08-25
出处:作者授权
责任编辑:方舟
[文章导读]
这里给出一个读取属性文件的单例类,作为单例模式的一个实用的例子
advertisement
热点推荐
· 天极网软件频道改版调查
· 在ASP.NET程序中创建唯一序号
· 用JVM工具接口创建调试和分析代理
· Win 2000如何安装配置防火墙
· 防范Windows消息钩子的侵入
[正文]

上一页  1 2 3  

  Java 语言中的单例模式

  Java 语言中就有很多的单例模式的应用实例,这里讨论比较有名的几个。

  Java 的Runtime 对象

  在Java 语言内部,java.lang.Runtime 对象就是一个使用单例模式的例子。在每一个Java 应用程序里面,都有惟一的一个Runtime 对象。通过这个Runtime 对象,应用程序可以与其运行环境发生相互作用。
Runtime 类提供一个静态工厂方法getRuntime()::

public static Runtime getRuntime();

  通过调用此方法,可以获得Runtime 类惟一的一个实例:

Runtime rt = Runtime getRuntime();

  Runtime 对象通常的用途包括:执行外部命令;返回现有内存即全部内存;运行垃圾收集器;加载动态库等。下面的例子演示了怎样使用Runtime 对象运行一个外部程序。

  代码清单8:怎样使用Runtime 对象运行一个外部命令

import java.io.*;
public class CmdTest
{
public static void main(String[] args) throws IOException
{
Process proc = Runtime.getRuntime().exec("notepad.exe");
}
}


  上面的程序在运行时会打开notepad 程序。应当指出的是,在Windows 2000 的环境中,如果需要打开一个Word 文件,而又不想指明Word 软件安装的位置时,可以使用下面的做法:

Process proc = Runtime.getRuntime().exec(
"cmd /E:ON /c start MyDocument.doc");

  在上面,被执行的命令是start MyDocument.doc ,开关E:ON 指定DOS 命令处理器允许命令扩展,而开关/C 指明后面跟随的字符串是命令,并在执行命令后关闭DOS 窗口,start 命令会开启一个单独的窗口执行所提供的命令。

  Introspector 类

  一般的应用程序可能永远也不会直接用到Introspector 类,但读者应该知道Introspector 是做什么的。Sun 提供了一个叫做BeanBox 的系统,允许动态地加载JavaBean ,并动态地修改其性质。BeanBox 在运行时的情况如下图所示。



  在上面的图中显示了BeanBox 最重要的两个视窗,一个叫做BeanBox 视窗,另一个叫做性质视窗。在上面的BeanBox 视窗中显示了一个Juggler Bean 被放置到视窗中的情况。相应的,在性质视窗中显示了Juggler Bean 的所有性质。所有的Java 集成环境都提供这种功能,这样的系统就叫做BeanBox 系统。

  BeanBox 系统使用一种自省(Introspection )过程来确定一个Bean 所输出的性质、事件和方法。这个自省机制是通过自省者类,也即java.util.Introspector 类实现的;这个机制是建立在Java 反射(Reflection) 机制和命名规范的基础之上的。比如,Introspector 类可以确定Juggler Bean 所支持的所有的性质,这是因为Introspector 类可以得到所有的方法,然后将其中的取值和赋值方法以及它们的特征加以比较,从而得出结果。显然,在整个BeanBox 系统中只需要一个Introspector 对象,下面所示就是这个类的结构图。



  可以看出,Introspector 类的构造子是私有的, 一个静态工厂方法instantiate() 提供了Instrospector 类的惟一实例。换言之,这个类是单例模式的应用。

  java.awt.Toolkit 类

  Toolkit 类是一个非常有趣的单例模式的例子。Toolkit 使用单例模式创建所谓的Toolkit 的默认对象,并且确保这个默认实例在整个系统中是惟一的。Toolkit 类提供了一个静态的方法getDefaultToolkit() 来提供这个惟一的实例,这个方法相当于懒汉式的单例方法,因此整个方法都是同步化的。

  代码清单9:getDefaultToolkit() 方法

public static synchronized Toolkit
getDefaultToolkit()
{
......
}

  Toolkit 类的类图如下所示。



  其中性质defaultToolkit 实际上就是静态的getDefaultToolkit 类。有趣的是,由于Toolkit 是一个抽象类,因此其子类如果提供一个私有的构造子,那么其子类便是一个正常的单例类;而如果其子类作为具体实现提供一个公开的构造子, 这时候这个具体子类便是" 不完全"的单例类。关于"不完全"的单例类的讨论请见本章后面的"专题:不完全的单例类"一节。

  模版方法模式

  同时,熟悉模版方法模式的读者可以看出,getDefaultToolkit() 方法实际上是一个模版方法。私有构造子是推迟到子类实现的剩余逻辑,根据子类对这个剩余逻辑的不同实现, 子类就可以提供完全不同的行为。对Toolkit 的子类而言,私有构造子依赖于操作系统,不同的子类可以根据不同的操作系统而给出不同的逻辑,从而使Toolkit 的子类对不同的操作系统给出不同的行为。

  javax.swing.TimerQueue 类

  这是一个不完全的单例类,由于这个类是在Swing 的定时器类中使用的,因此我们将在后面介绍。

上一页  1 2 3  

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 主板超频特色技术GIGA技嘉篇
  • Win 2000如何安装配置防火墙
  • 防范Windows消息钩子的侵入
  • 性价比之选 AGP显卡的告别秀
  • 大学校园生活之聊天也疯狂
  • Fireworks制作GIF动画Banner
  • 金山打击外挂 遭网络游戏玩家起诉
  • 完全公测《开天》掀起滔滔巨浪
  • Advertisement