背景介绍
下面是一个读取配置文件的简单程序AppConfig
public class AppConfig {
/**
* 用来存放配置文件中参数A的值
*/
private String parameterA;
/**
* 用来存放配置文件中参数B的值
*/
private String parameterB;
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
/**
* 构造方法
*/
public AppConfig(){
//调用读取配置文件的方法
readConfig();
}
/**
* 读取配置文件,把配置文件中的内容读出来设置到属性上
*/
private void readConfig(){
// 根据情况,实际编码
}
}
客户端调用代码
public class Client {
public static void main(String[] args) {
//创建读取应用配置的对象
AppConfig config = new AppConfig();
String paramA = config.getParameterA();
String paramB = config.getParameterB();
// 其他操作
}
}
客户端在调用AppConfig来读取配置文件时,每次都会new一个对象出来。对于一个系统来说,存在着多个AppConfig对象,也就存在这个多个封装的配置文件信息,严重的浪费这个系统资源。
此时,就可以考虑使用单例模式来进行优化。
模式介绍
单例模式是比较常用的一种模式。顾名思义,也就是在系统运行期间,某个类只存在一个类实例。
实现单例
package com.yiguo.singleton;
/**
* 单例示例
*/
public class Singleton {
/**
* 定义一个变量来存储创建好的类实例
*/
private static Singleton uniqueInstance = null;
/**
* 私有化构造方法,好在内部控制创建实例的数目
*/
private Singleton(){
//
}
/**
* 定义一个方法来为客户端提供类实例
* @return 一个Singleton的实例
*/
public static synchronized Singleton getInstance(){
//判断存储实例的变量是否有值
if(uniqueInstance == null){
//如果没有,就创建一个类实例,并把值赋值给存储类实例的变量
uniqueInstance = new Singleton();
}
//如果有值,那就直接使用
return uniqueInstance;
}
/**
* 示意方法,单例可以有自己的操作
*/
public void singletonOperation(){
//功能处理
}
/**
* 示意属性,单例可以有自己的属性
*/
private String singletonData;
/**
* 示意方法,让外部通过这些方法来访问属性的值
* @return 属性的值
*/
public String getSingletonData(){
return singletonData;
}
}
应用模式
以下代码只展示应用单例模式的地方,未作变动的代码省略。
public class AppConfig {
/**
* 定义一个变量来存储创建好的类实例,直接在这里创建类实例,只会创建一次
*/
private static AppConfig instance = new AppConfig();
/**
* 定义一个方法来为客户端提供AppConfig类的实例
* @return 一个AppConfig的实例
*/
public static AppConfig getInstance(){
return instance;
}
/**
* 私有化构造方法
*/
private AppConfig(){
//调用读取配置文件的方法
readConfig();
}
/**
* 读取配置文件,把配置文件中的内容读出来设置到属性上
*/
private void readConfig(){
//操作
}
}
客户端调用
public class Client {
public static void main(String[] args) {
//创建读取应用配置的对象
AppConfig config = AppConfig.getInstance();
}
}
本文完整代码,可以参见:https://github.com/TrumanXia/design_patterns