多例模式可以拥有多个实例,自己创建、管理自己的实例,并且向外界提供实例。
多例模式又分为有上限的多例模式和没有上限的多例模式,没有上限的多例模式创建的实例数是没有上限的,需要使用聚集管理所有的实例。
有状态的多例模式也存在和有状态的单例模式类似的问题,使用时应加以注意。
国际化(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 = u7f8eu5143
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码。