多例模式
多例模式可以拥有多个实例,自己创建、管理自己的实例,并且向外界提供实例。
多例模式又分为有上限的多例模式和没有上限的多例模式,没有上限的多例模式创建的实例数是没有上限的,需要使用聚集管理所有的实例。
有状态的多例模式也存在和有状态的单例模式类似的问题,使用时应加以注意。
国际化(internationalization)简称i18n(从i到n中间刚好是18个字母),就是一个多例模式的例子。不同的语言环境下给出不同的显示。
国际化需要properties文件,Locale和ResourceBundle。
Locale locale = new Locale("zh");
ResourceBundle rb = ResourceBundle.getBundle("interview.staticIn.justtest",locale);
System.out.println("---"+ rb.getString("USD"));
Locale locale = new Locale("zh");其中的zh是语言名称,表示汉语。也可以使用Locale locale = new Locale("zh","CN");CN是区域名称,表示中国。
还需要在interview.staticIn文件夹下有名为justtest_zh.properties的资源文件。文件的内容如下:
USD = \u7f8e\u5143
LingualResource是一个多例模式的实例,根据传入语言的不同,显示不同的文字
public class LingualResource {
private String languageCode = "en";
private String regionCode = "US";
private String localeCode = "en_US";
private static final String FILE_NAME = "interview.staticIn.res";
private static HashMap instances = new HashMap(10);
private Locale locale = null;
private ResourceBundle resourceBundle = null;
private LingualResource lnkLingualResource;
private LingualResource(String languageCode, String regionCode) {
this.languageCode = languageCode;
this.regionCode = regionCode;
localeCode = makeLocaleCode(languageCode, regionCode);
locale = new Locale(languageCode, regionCode);
resourceBundle = ResourceBundle.getBundle(FILE_NAME, locale);
instances.put(localeCode, resourceBundle);
}
private LingualResource() {
//do nothing
}
public synchronized static LingualResource getInstance(String language,String region) {
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;
}
}
LingualResourceTester模拟客户端,在不同语言环境下的输出
public class LingualResourceTester {
public static void main(String [ ] args) {
LingualResource ling = LingualResource.getInstance("en", "US");
String usDollar = ling.getLocaleString("USD");
System.out.println("USD=" + usDollar);
LingualResource lingZh = LingualResource.getInstance("zh", "CH");
String usDollarZh = lingZh.getLocaleString("USD");
System.out.println("USD=" + usDollarZh);
}
}
输出为:
USD=US Dollar
USD=美元
上述例子还需要在interview.staticIn文件夹下有名为res_en_US.properties和res_zh_CN.properties的资源文件。
在资源文件中直接编辑中文,需要下载插件将其转换为ASCII码。
浙公网安备 33010602011771号