ocale);
代码清单4、怎样使用Locale对象和ResourceBundle对象。
在上面的例子里面,res对象会加载一个名为shortname_fr_FR.properties的Resource文件。
系统的设计
这里给出系统的结构图。其中LingualResourceTester是一个示意性的客户端类,而LingualResource是一个多态类。
图7、多态类LingualResource和客户端类的类图结构。
下面就是这个多态类的源代码:
package com.javapatterns.multilingual;
import java.util.HashMap;
import java.util.Locale;
import java.util.ResourceBundle;
public class LingualResource
{
private String language = "en";
private String region = "US";
private String localeCode = "en_US";
private static final String FILE_NAME = "res";
private static HashMap instances =
new HashMap(19);
private Locale locale = null;
private ResourceBundle resourceBundle = null;
private LingualResource lnkLingualResource;
/**
* 私有的构造子保证外界无法直接将此类实例化
*/
private LingualResource(
String language, String region)
{
this.localeCode = language;
this.region = region;
localeCode =
makeLocaleCode(language , region);
locale = new Locale(language, region);
resourceBundle =
ResourceBundle.getBundle(FILE_NAME, locale);
instances.put( makeLocaleCode(language, region) ,
resourceBundle);
}
/**
* 私有的构造子保证外界无法直接将此类实例化
*/
private LingualResource()
{
file://do nothing
}
/**
* 工厂方法,返还一个具有指定的内部状态的实例
*/
public synchronized static LingualResource
getInstance(String language, String region)
{
if (instances.containsKey(
makeLocaleCode(language , region )))
{
return (LingualResource) instances.get(
makeLocaleCode(language , region ));
}
else
{
return new
LingualResource(language, region);
}
}
public String getLocaleString(String code)
{
return resourceBundle.getString(code);
}
private static String makeLocaleCode(
String language, String region)
{
return language + "_" + region;
}
}
Java模式设计之多态模式与多语言支持(6)
时间:2010-12-13
代码清单5、多态类LingualResource的源代码。其中的makeLocaleCode()是一个辅助性的方法,在传入语言代码和地区代码时,此方法可以返回一个Locale代码。
这个多态类的构造子是私有的,因此不能用new关键字来实例化。所有的实例必须通过调用静态getInstance()方法来得到。在getInstance()方法被调用时,程序会首先检查传入的Locale代码是否已经在instances集合中存在;如果已经存在,即直接返回它所对应的LingualResource对象,否则就会首先创建一个这个Locale代码所对应的LingualResource对象,将之存入instances集合,并返回这个实例。
下面给出一个客户端的源代码:
package com.javapatterns.multilingual;
public class LingualResourceTester
{
public s
|