如果这个输出流是导向一个文件的,那么这个方法就将属性流存入文件。
为什么需要使用单例模式属性是系统的一种quot资源quot,应当避免有多余一个的对象读取特别是存储属性。
此外,属性的读取可能会在很多地方发生,创建属性对象的地方应当在哪里不是很清楚。
换言之,属性管理器应当自己创建自己的实例,并且自己向系统全程提供这一事例。
因此,属性文件管理器应当是一个单例模式负责。
系统设计 系统的核心是一个属性管理器,也就是一个叫做 ConfigManager 的类,这个类应当是一个单例类。
因此,这个类应当有一个静态工厂方法,不妨叫做 getInstance, 用于提供自己的实例。
为简单起见,本文在这里采取quot饿汉quot方式实现 ConfigManager 。
例子的类图如下所示。
本例子的源代码如下所示。
代码清单 6:ConfigManager 的源代码import java.util.Propertiesimport java.io.FileInputStreamimport java.io.Filepublic class ConfigManager/ 属性文件全名/private static final String PFILE System.getPropertyquotuser.dirquot File.Separator quotSingleton.propertiesquot/ 对应于属性文件的文件对象变量/private File m_file null/ 属性文件的最后修改日期/private long m_lastModifiedTime 0/ 属性文件所对应的属性对象变量/private Properties m_props null/ 本类可能存在的惟一的一个实例/private static ConfigManager m_instance 234Java 与模式new ConfigManager/ 私有的构造子,用以保证外界无法直接实例化/private ConfigManagerm_file new FilePFILEm_lastModifiedTime m_file.lastModifiedifm_lastModifiedTime 0System.err.printlnPFILE quot file does not existquotm_props new Propertiestrym_props.loadnew FileInputStreamPFILEcatchException ee.printStackTrace/ 静态工厂方法 return 返还 ConfigManager 类的单一实例/synchronized public static ConfigManagergetInstancereturn m_instance/ 读取一特定的属性项 param name 属性项的项名 param defaultVal 属性项的默认值 return 属性项的值(如此项存在), 默认值(如此项不存在)/final public Object getConfigItemString name, Object defaultVallong newTime m_file.lastModified// 检查属性文件是否被其他程序// (多数情况是程序员手动)修改过// 如果是,重新读取此文件ifnewTime 0// 属性文件不存在ifm_lastModifiedTime 0System.err.printlnPFILE quot file does not existquotelseSystem.err.printlnPFILE quot file was deletedquotreturn defaultValelse ifnewTime gt m_lastModifiedTime// Get rid of the old propertiesm_props.cleartrym_props.loadnew FileInputStreamPFILEcatchException ee.printStackTracem_lastModifiedTime newTimeObject val m_props.getPropertynameif val null return defaultValelsereturn val 在上面直接使用了一个局域的常量储存储属性文件的路径。
在实际的系统中,读者可以采取更灵活的方式将属性文件的路径传入。
读者可以看到,这个管理器类有一个很有意思的功能,即在每一次调用时,检查属性文件是否已经被更新过。
如果确实已经被更新过的话,管理器会自动重新加载属性文件, 从而保证管理器的内容与属性文件的内容总是一致的。
怎样调用属性管理器 下面的源代码演示了怎样调用 ConfigManager 来读取属性文件。
代码清单 7:怎样调用 ConfigManager 类以读取属性文件BufferedReader reader new BufferedReadernew InputStreamReaderSystem.inSystem.out.printlnquotType quit to quitquotdoSystem.out.printquotProperty item to read: quotString line reader.readLineifline.equalsquotquitquotbreakSystem.out.printlnConfigManager.getInstance.getConfigItemline, quotNot found.quot whiletrue 上面代码运行时的情况如下图所示。
感兴趣的读者可以参考阅读本书的quot专题:XMLProperties 与适配器模式quot一章,那里对使用 Java 属性类和 XML 文件格式做了有用的讨论。
Java 语言中的单例模式 Java 语言中就有很多的单例模式的应用实例,这里讨论比较有名的几个。
Java 的 Runtime 对象 在 Java 语言内部,java.lang.Runtime 对象就是一个使用单例模式的例子。
在每一个 Java应用程序里面,都有惟一的一个 Runtime 对象。
通过这个 Runtime 对象,应用程序可以与其运行环境发生相互作用。
Runtime 类提供一个静态工厂方法 getRuntime::public static Runtime getRuntime 通过调用此方法,可以获得 Runtime 类惟一的一个实例:Runtime rt Runtime getRuntime Runtime 对象通常的用途包括:执行外部.
上一篇:
程序员能力矩阵
下一篇:
14年银行职员入党申请书格式