• 多例模式


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

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

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

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

          

  • 相关阅读:
    机器学习回顾篇(14):主成分分析法(PCA)
    Elasticsearch系列---前缀搜索和模糊搜索
    Elasticsearch系列---近似匹配
    Elasticsearch系列---多字段搜索
    Elasticsearch系列---深入全文搜索
    Elasticsearch系列---shard内部原理
    Elasticsearch系列---结构化搜索
    01、Spring环境搭建
    02、Hibernate开发步骤
    01、Hibernate安装配置
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/3801307.html
Copyright © 2020-2023  润新知