多例模式与应用程序国际化

来源:互联网 发布:淘宝卖一分钱壁纸违规 编辑:程序博客网 时间:2024/05/17 06:11

多例模式,使得一个类负责创建自己的多个实例,外界调用获取这个类的实例只需要通过GetInstance来实现,这样类自身的

构造函数设置为私有的,对外界隐藏,只留一个GetInstance供外界使用,而由GetInstance负责调用自己的构造方法.对于要创建自己的多个实例就需要通过在类内部声明自己的静态私有的若干个该类的对象,这些对象通过自己的构造函数的调用已经生成.

而外界通过向GetInstance传如一个指定的参数来获得某一个对象.

 在应用程序国际化的过程中,通过一个资源包类ResourceBundle,这个ResourceBundle其成员共享一个公共的基本名称,但是名称中还有标识其语言环境的其他组件。例如,某个资源包系列的基本名称可能是 "MyResources"。该系列应该有一个默认资源包,其名称与其系列名相同( "MyResources"),此系列可根据需要提供特定于语言环境的成员,例如一个名为 "MyResources_de" 的德语资源包。

当程序需要特定于语言环境的对象时,它使用  getBundle方法加载ResourceBundle类

ResourceBundle myResources =      ResourceBundle.getBundle("MyResources", currentLocale);
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 localCode="en_US";
 private static final String FILE_NAME="res";//公共的基本名字
 private static HashMap instance=new HashMap(19); 建立影射表来存储键到键值的对应
 private Locale locale=null;
 private ResourceBundle resourcebundle=null;
 private LingualResource lnkLingualResource;
 
 private LingualResource(String language,String region)
 {
  this.localCode=language;
  this.region=region;
  localCode=makeLocaleCode(language,region);
  locale=new Locale(language,region);
  resourcebundle=ResourceBundle.getBundle(FILE_NAME, locale);//找到本地化的资源包
  instance.put(makeLocaleCode(language,region), resourcebundle);

//将语言_地区字符串和相应资源包的对应存储在映射表中
  
  
 }
 public synchronized static LingualResource getInstance(String language,String region)
 {
  if(instance.containsKey(makeLocaleCode(language,region)))//隐射表中已有该资源包直接从映射表中返回
   return(LingualResource) instance.get(makeLocaleCode(language,region));
  else //没有就创建一个,调用构造函数
   return new LingualResource(language,region);
 }
 public String getLocaleString(String code)
 {
  return resourcebundle.getString(code); //获取code 在相应语言环境下的表示
  
 }
 private static String makeLocaleCode(String language,String region)
 {
  return language+"_"+region;
  
 }
}

 

一个测试的函数


public class LingualResourceTester {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  LingualResource ling=LingualResource.getInstance("en", "US" );
  String usDollar=ling.getLocaleString("USD");
  System.out.println(usDollar);
  LingualResource lingZH=LingualResource.getInstance("zh", "CH" );
  String usDollarZH=lingZH.getLocaleString("USD");
  System.out.println(usDollarZH);

}
}

res_en_US.properties存储

USD=US Dollar

JPY=japanese yen

res_zh_CH.properties存储

USD=美圆

JPY=日圆

打印结果:

US Dollar
美元