现在的位置: 首页 > 综合 > 正文

设计模式 第5篇 多例模式 Muititon Pattern 与 JAVA资源国际化处理

2014年02月09日 ⁄ 综合 ⁄ 共 2054字 ⁄ 字号 评论关闭

多例模式是一种对象创建模式,具体有两个特点:

(1)多例类可以具有多个实例

(2)多例类必须自己创建和管理自己的实例,并且向外界提供自己的实例

以资源国际化为例:比如一个网站访问者包括世界各地的人,不同地域不同语言的访问者可以选择网站所需要呈现的语言,比如选择中文。

首先介绍下 JAVA使用properties文件与Locale以及ResourceBundle做资源国际化处理:

 

资源文件的命名规则是filename + Locale代码的properties文件 。

Locale对象与ResourceBundle对象的使用:

//创建Locale代码
Locale locale = new Locale("zh","CH");
//此时系统会在类加载路径下(即src)加载一个名为 res_zh_CH 的的properties文件
ResourceBundle rBundle = ResourceBundle.getBundle("res",locale);
//根据资源文件中的“name”键值得到value
String str = rBundle.getString("name");

介绍完JAVA处理资源国际化的原理后,我们开始思考怎样将多例模式运用到资源国际化中去?具体看代码吧,你懂的!

public class LingualResource {

	private static final String FILE_NAME = "res";
	
	private Locale mLocale ;
	private ResourceBundle mResourceBundle ;
	
	private static Hashtable<String , LingualResource> instances = new Hashtable();
	
	private String language ;
	private String region ;
	
	/**
	 * 私有话构造子,多例类自己负责具体实例的创建
	 */
	private LingualResource(){
		
	}
	
	private LingualResource(String language , String region){
		this.language = language ;
		this.region = region ;
		this.mLocale = new Locale(this.language, this.region);
		this.mResourceBundle = ResourceBundle.getBundle(FILE_NAME, mLocale);
		instances.put(makeLocaleCode(language, region), this);
	}
	
	/**
	 * 向外界提供具体的实例
	 * @param language
	 * @param region
	 * @return
	 */
	public static synchronized LingualResource getInstance(String language , String region){
		String localeCode = makeLocaleCode(language, region);
		if(instances.containsKey(localeCode)){
			return instances.get(localeCode);
		}else 
			return new LingualResource(language, region);
	}
	
	
	public String getLocaleString(String code){
		return this.mResourceBundle.getString(code);
	}
	
	
	private static String makeLocaleCode(String language , String region){
		return language+"_"+region ;
	}
	
}

 

public class Client {

	public static void main(String[] args) throws UnsupportedEncodingException {

		LingualResource l1 = LingualResource.getInstance("en", "US");
		System.out.println(l1.getLocaleString("JPY")); //打印结果 --> Japanese Yen
		System.out.println("----------------");
		LingualResource l2 = LingualResource.getInstance("zh", "CH");
		System.out.println(new String(l2.getLocaleString("JPY").getBytes("ISO-8859-1"),"utf-8")); //打印结果--> 日圆
		
	}

}

资源文件:

res_en_US.properties内容:

USD=US Dollar
JPY=Japanese Yen

 

res_zh_CH.properties内容

USD=美元
JPY=日圆

 

 

抱歉!评论已关闭.