多例模式

      多例模式可以拥有多个实例,自己创建、管理自己的实例,并且向外界提供实例。

      多例模式又分为有上限的多例模式和没有上限的多例模式,没有上限的多例模式创建的实例数是没有上限的,需要使用聚集管理所有的实例。

      有状态的多例模式也存在和有状态的单例模式类似的问题,使用时应加以注意。

      国际化(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码。

      

原文地址:https://www.cnblogs.com/lnlvinso/p/3801307.html