`
yangyiqian
  • 浏览: 117862 次
  • 来自: ...
社区版块
存档分类
最新评论

Java模式设计之单例模式

    博客分类:
  • JAVA
阅读更多
 一个实用的例子:属性治理器
  
  什么是属性文件
  
   <!-- frame contents -->
<!-- /frame contents -->   这里给出一个读取属性(properties) 文件的单例类,作为单例模式的一个实用的例子。属性文件如同老式的视窗编程时的.ini 文件,用于存放系统的配置信息。配置信息在属性文件中以属性的方式存放,一个属性就是两个字符串组成的对子,其中一个字符串是键(key),另一个字符串是这个键的值(value)。
  
  大多数的系统都有一些配置常量,这些常量假如是存储在程序内部的,那么每一次修改这些常量都需要重新编译程序。将这些常量放在配置文件中,系统通过访问这个配置文件取得配置常量,就可以通过修改配置文件而无需修改程序而达到更改系统配置的目的。系统也可以在配置文件中存储一些工作环境信息,这样在系统重启时,这些工作信息可以延续到下一个运行周期中。
  
  假定需要读取的属性文件就在当前目录中,且文件名为singleton.properties 。这个文件中有如下的一些属性项。
  
  代码清单5:属性文件内容
  
   node1.item1=How
  node1.item2=are
  node2.item1=you
  node2.item2=doing
  node3.item1=?
  例如,node1.item1 就是一个键,而How 就是这个键所对应的值。
  
  Java 属性类
  
  Java 提供了一个工具类,称做属性类,可以用来完成Java 属性和属性文件的操作。这个属性类的继续关系可以从下面的类图中看清楚。
  
  
  
  属性类提供了读取属性和设置属性的各种方法。其中读取属性的方法有:
  
   .. contains(Object value) 、containsKey(Object key): 假如给定的参数或属性要害字在属性表中有定义,该方法返回True ,否则返回False。
  
   .. getProperty(String key)、getProperty(String key, String default) :根据给定的属性要害字获取要害字值。
  
   .. list(PrintStream s) 、list(PrintWriter w) :在输出流中输出属性表内容。
  
   .. size():返回当前属性表中定义的属性要害字个数。
  
  设置属性的方法有:
  
   .. put(Object key, Object value) :向属性表中追加属性要害字和要害字的值。
  
   .. remove(Object key):从属性表中删除要害字。
  
  从属性文件加载属性的方法为load(InputStream inStream),可以从一个输入流中读入一个属性列,假如这个流是来自一个文件的话,这个方法就从文件中读入属性。
  
  将属性存入属性文件的方法有几个,重要的一个是store(OutputStream out, String header) ,将当前的属性列写入一个输出流,假如这个输出流是导向一个文件的,那么这个方法就将属性流存入文件。进入讨论组讨论。
为什么需要使用单例模式
  
  属性是系统的一种"资源",应当避免有多余一个的对象读取非凡是存储属性。此外,属性的读取可能会在很多地方发生,创建属性对象的地方应当在哪里不是很清楚。换言之,属性治理器应当自己创建自己的实例,并且自己向系统全程提供这一事例。因此,属性文件治理器应当是一个单例模式负责。
  
  系统设计
  
  系统的核心是一个属性治理器,也就是一个叫做ConfigManager 的类,这个类应当是一个单例类。因此,这个类应当有一个静态工厂方法,不妨叫做getInstance(), 用于提供自己的实例。
  
  为简单起见,本文在这里采取"饿汉"方式实现ConfigManager 。例子的类图如下所示。
  
  

  
  本例子的源代码如下所示。
  
  代码清单6:ConfigManager 的源代码
  
   import java.util.Properties;
  import java.io.FileInputStream;
  import java.io.File;
  public class ConfigManager
  {
  /**
  * 属性文件全名
  */
  private static final String PFILE =
  System.getProperty("user.dir")
  + File.Separator + "Singleton.properties";
  /**
  * 对应于属性文件的文件对象变量
  */
  private File m_file = null;
  /**
  * 属性文件的最后修改日期
  */
  private long m_lastModifiedTime = 0;
  /**
  * 属性文件所对应的属性对象变量
  */
  private Properties m_props = null;
  /**
  * 本类可能存在的惟一的一个实例
  */
  private static ConfigManager m_instance =
  ·234·Java 与模式
  new 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)
  {
  // Get rid of the old properties
  m_props.clear();
  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;
  }
  }
  }
  在上面直接使用了一个局域的常量储存储属性文件的路径。在实际的系统中,读者可以采取更灵活的方式将属性文件的路径传入。
  
  读者可以看到,这个治理器类有一个很有意思的功能,即在每一次调用时,检查属性文件是否已经被更新过。假如确实已经被更新过的话,治理器会自动重新加载属性文件, 从而保证治理器的内容与属性文件的内容总是一致的。
  
  怎样调用属性治理器
  
  下面的源代码演示了怎样调用ConfigManager 来读取属性文件。
  
  代码清单7:怎样调用ConfigManager 类以读取属性文件
分享到:
评论

相关推荐

    java模式设计之单例模式

    单例模式是设计模式中的一种,它的核心思想是限制类的实例化,确保在程序运行过程中,对于某个类,全局只存在一个实例。这种模式常用于资源管理器,如打印服务、数据库连接池等,因为这些资源通常需要全局共享且有序...

    Java模式设计之单例模式[借鉴].pdf

    单例模式是设计模式中的一种,它用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。这种模式常用于资源管理,比如管理打印机、通信端口或者系统配置等,因为这些资源通常需要全局共享且初始化...

    Java设计模式之单例模式讲解

    入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...

    Java SE程序 单例模式

    Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式...

    Java设计模式之单例模式

    目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    java设计模式之单例模式.zip

    在Java中实现单例模式有多种方法: 1. **饿汉式(静态常量)**:在类加载时就完成了初始化,所以没有线程安全问题,但这种实现方式无法实现延迟加载。 ```java public class Singleton { private static final ...

    JAVA设计模式之单例模式(完整版)1[定义].pdf

    JAVA设计模式之单例模式(完整版)1[定义].pdf

    Java设计模式之单例模式的七种写法

    Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...

    设计模式之单例模式(结合工厂模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    本篇将深入探讨标题中提及的几种设计模式:Model-View-Controller(MVC)模式、单例模式、代理模式以及工厂模式,尤其是简单工厂模式。 **1. Model-View-Controller (MVC) 模式** MVC模式是一种架构模式,它将应用...

    JAVA设计模式之单例模式

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用,尤其是在需要控制实例化过程,或者确保某类只有一个实例时。本文将深入探讨Java中的单例模式,帮助你理解其原理和应用。 单例模式的核心思想是...

    java设计模式之单例模式详解

    Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    MVC模式使得用户界面与数据逻辑分离,单例模式保证关键资源的唯一访问点,代理模式在访问对象前后增加额外的功能,工厂模式将对象创建与使用分离,简单工厂模式为对象创建提供一个简单便捷的接口。通过这些模式,...

    java设计模式之单例模式

    Java设计模式中的单例模式是一种常用的创建型设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置信息等。接下来,我们将深入探讨8种不同的单例...

    Java实现多种单例模式

    在Java编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是...

    Java设计模式-单例模式详解

    Java设计模式-单例模式详解 单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 ...

Global site tag (gtag.js) - Google Analytics