利用多例模式编写配置文件读取器

    多例模式是单例模式的一个变种,可以根据一个特征值购建一个唯一的在JVM中的实例,有多少个特征值就可以创建多少个实例,如果这个特征值是无限的,就可以创建无限多个实例,但是每个实例一定是和特征值绑定的,每一个特征值的实例在JVM中,有且只有1个。

    根据这个特点,想到如下的一个应用:

    项目中有多个配置文件,但每一个配置文件应该只有一个实例在内存中,没有必要为每一个文件写一个单例类,每一个配置文件名,就是一个特征值,这个应用刚好符合多例模式的使用。

 

package com.balance.message.common.util;

import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class MessageProperties {
	
	private static Map<String,MessageProperties> map_messageProperties = new HashMap<String,MessageProperties>(19);
	
	private Properties ps;
	
	private MessageProperties(String propertiesFileName){	
		InputStream in = null;	
		try{		
			ps = new Properties();			
			URL url = this.getClass().getClassLoader().getResource(propertiesFileName);
			
			if(url != null){
				in = this.getClass().getClassLoader().getResource(propertiesFileName).openStream();	
			}else {
				in = this.getClass().getResourceAsStream(propertiesFileName);
			}
			ps.load(in);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(in != null){
				try{
					in.close();
					in = null;	
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	
	public static MessageProperties getInstance(String propertiesFileName){
		if(!map_messageProperties.containsKey(propertiesFileName)){
			MessageProperties messageProperties  = new MessageProperties(propertiesFileName);
			map_messageProperties.put(propertiesFileName, messageProperties);
		}
		return map_messageProperties.get(propertiesFileName);
	}
	
	public String getValue(String key){
		return ps.getProperty(key);
	}
}

 

我们在classpath下放上下面2个配置文件

    msg.head.properties

header.cut.as = 160
header.cut.atd = 160
header.cut.fd = 160
header.cut.sq = 160

    msg.tailer.properties

trailer.cut.as = 8000
trailer.cut.atd = 7900
trailer.cut.fd = 6800
trailer.cut.sq = 7300

 

下面使用这个MessageProperties去读取属性,

public static void main(String[] args){
		System.out.println(MessageProperties.getInstance("msg.head.properties").getValue("header.cut.fd"));
		System.out.println(MessageProperties.getInstance("msg.tailer.properties").getValue("trailer.cut.as"));	
	}

 

 

执行结果:

160
8000

 

你可能感兴趣的:(配置文件)