一个实用的例子
这里作者给出一个读取属性(properties)文件的单态类,作为单态类的一个实用的例子。属性文件如同老式的视窗编程时的.ini文件,属于系统的“资源“,而读取属性文件即为资源管理, 显然应当由一个单态类负责。
图7. 这个例子的UML
Java语言单态创立性模式介绍(6)
时间:2010-12-17
显然,在大多数的系统中都会涉及属性文件的读取问题,因而这个例子非常有实用价值。在这个例子里,作者假定需要读取的属性文件就在当前目录中,且名为singleton.properties。在这个文件中有如下的一些属性项:
node1.item1=How
node1.item2=are
node2.item1=you
node2.item2=doing
node3.item1=?
代码清单7. 属性文件内容
本例子的源代码如下:
package com.javapatterns.singleton.demos;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.File;
public class ConfigManager
{
/**
* 私有的构造子, 用以保证实例化的唯一性
*/
private ConfigManager()
{
m_file = new File(PFILE);
m_lastModifiedTime = m_file.lastModified();
if(m_lastModifiedTime == 0)
{
System.err.println(PFILE + " file does not exist!");
}
m_props = new Properties();
try
{
m_props.load(new FileInputStream(PFILE));
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
*
* @return 返还ConfigManager类的单一实例
*/
synchronized public static ConfigManager getInstance()
{
return m_instance;
}
/**
* 读取一特定的属性项
*
* @param name 属性项的项名
* @param defaultVal 属性项的缺省值
* @return 属性项的值(如此项存在), 缺省值(如此项不存在)
*/
final public Object getConfigItem(String name, Object defaultVal)
{
long newTime = m_file.lastModified();
// 检查属性文件是否被其它程序(多数情况是程序员手动)修改过。
// 如果是,重新读取此文件。
if(newTime == 0)
{
// 属性文件不存在
if(m_lastModifiedTime == 0)
{
System.err.println(PFILE + " file does not exist!");
}
else
{
System.err.println(PFILE + " file was deleted!!");
}
return defaultVal;
}
else if(newTime > m_lastModifiedTime)
{
m_props.clear(); // Get rid of the old properties
try
{
m_props.load(new FileInputStream(PFILE));
}
catch(Exception e)
{
e.printStackTrace();
}
}
m_lastModifiedTime = newTime;
Object val = m_props.getProperty(name);
if( val == null )
{
return defaultVal;
}
else
{
return val;
}
}
/**
* 属性文件全名
*/
private static final String PFILE = System.getProperty("user.dir")
+ "/Singleton.properties";
/**
* 对应于属性文件的文件对象变量
*/
private File m_file = null;
/**
* 属性文件的最后修改日期
*/
private long m_lastModifiedTime = 0;
/**
* 属性文件所对应的属性对象变量
*/
private Properties m_props = null;
/**
* 本类可能存在
|