- 浏览: 341298 次
- 性别:
- 来自: 广州
文章分类
最新评论
一个真实的项目:
这是一个真实的而向全球消费者的华尔街金融网站项目的一部分,系统根据用户选择的语言将网站的静态文字和动态文字全部转换为用户所选择的语言.这实际就是多国语的实现.
单例模式的精神是允许有限个实例,并不是仅允许一人实例,这种允许有限多个实例并向整个JVM提供自己实例的类叫做多例类,这种模式叫做多例模式.现在就需要用多例模式来实现资源对象,需要构造出能提供有限个实例,每个实例有各不相同的属性(即Locale代码)的代码.
一:什么是多例模式
比如每一台麻将都要两个骰子,这里就以这个为例说明多例模式的结构:
在多例类Die中,使用了饿汉方式创建了两个Die实例,根据静态工厂方法的参数,工厂方法返回两个实例中的一个。多例类是单例类的推广,而单例类是多例类的特殊情况.如同单例类可以分成有状态和没有状态两种一样,多例类也可以分成这两种状态。注:如果一个系统是建立在诸如EJB和RMI等分散技术之上的,那么多例类会出现数个实例,在这种情况下除非提供有效的协调机制,不然最好不要用有状态和可变的单例类.
二:下面就用多例模式来完成多国语
先来看下什么是Locale代码,一个Locale代码由语言代码和地区代码组合而成,如:
语言代码地区代码Locale代码说明
en US en_US美国英语
zh CH zh_CH简体汉语
fr FR fr_FR法国法语
Resource文件及其命名规范:
一个Resource文件是一个简单的文本文件,一个Resource文件的名字是由一个短文件名和文件扩展名properties组成的,而Resource文件的短文件名则是java程序在调用此文件时使用的文件名.一个Resource文件和一个普通的properties文件并无本质的区别,但java语言对两者的支持是区别的,java.util.Properties类不支持多语言,而java.util.ResourceBundle类则支持多语言。
接下来看如何使用Locale对象和ResourceBundle对象读取Resource文件:
Locale locale = new Locale("fr","FR");
ResourceBundle res = ResourceBundle.getBundle("shortname",locale);
在上面的例子里,res对象会加载一个名为shortname_fr_FR.properties的Resource文件.
现在有两个Resource文件:
为美国英语准备的Resource文件res_en_US.properties的内容如下:
USD=US Dollar
JPY=Japanese Yen
为简体中文准备的Resource文件res_zh_CH.properties的内容如下:
USD=美元
JPY=日元
下面来看如何用LingualResource来实现多国语:
客户端测试程序如下:
为什么国际化又叫做i18n?
这是一个有趣的问题,因为国际的英文单词是Internationalization,第一个字母i和最后一个字母n之间有18个字母,因此取名为i18n.
这是一个真实的而向全球消费者的华尔街金融网站项目的一部分,系统根据用户选择的语言将网站的静态文字和动态文字全部转换为用户所选择的语言.这实际就是多国语的实现.
单例模式的精神是允许有限个实例,并不是仅允许一人实例,这种允许有限多个实例并向整个JVM提供自己实例的类叫做多例类,这种模式叫做多例模式.现在就需要用多例模式来实现资源对象,需要构造出能提供有限个实例,每个实例有各不相同的属性(即Locale代码)的代码.
一:什么是多例模式
比如每一台麻将都要两个骰子,这里就以这个为例说明多例模式的结构:
package cai.milenfan.basic.test; import java.util.Date; import java.util.Random; public class Die { private static Die die1 = new Die(); private static Die die2 = new Die(); private Die(){} public static Die getInstance(int whichOne){ if(whichOne==1){ return die1; }else{ return die2; } } //掷骰子,返回一个在1-6之间的随机数 public synchronized int dice(){ Date d = new Date(); Random r = new Random(d.getTime()); int value = r.nextInt(); value = Math.abs(value); value = value%6; value += 1; return value; } }
在多例类Die中,使用了饿汉方式创建了两个Die实例,根据静态工厂方法的参数,工厂方法返回两个实例中的一个。多例类是单例类的推广,而单例类是多例类的特殊情况.如同单例类可以分成有状态和没有状态两种一样,多例类也可以分成这两种状态。注:如果一个系统是建立在诸如EJB和RMI等分散技术之上的,那么多例类会出现数个实例,在这种情况下除非提供有效的协调机制,不然最好不要用有状态和可变的单例类.
二:下面就用多例模式来完成多国语
先来看下什么是Locale代码,一个Locale代码由语言代码和地区代码组合而成,如:
语言代码地区代码Locale代码说明
en US en_US美国英语
zh CH zh_CH简体汉语
fr FR fr_FR法国法语
Resource文件及其命名规范:
一个Resource文件是一个简单的文本文件,一个Resource文件的名字是由一个短文件名和文件扩展名properties组成的,而Resource文件的短文件名则是java程序在调用此文件时使用的文件名.一个Resource文件和一个普通的properties文件并无本质的区别,但java语言对两者的支持是区别的,java.util.Properties类不支持多语言,而java.util.ResourceBundle类则支持多语言。
接下来看如何使用Locale对象和ResourceBundle对象读取Resource文件:
Locale locale = new Locale("fr","FR");
ResourceBundle res = ResourceBundle.getBundle("shortname",locale);
在上面的例子里,res对象会加载一个名为shortname_fr_FR.properties的Resource文件.
现在有两个Resource文件:
为美国英语准备的Resource文件res_en_US.properties的内容如下:
USD=US Dollar
JPY=Japanese Yen
为简体中文准备的Resource文件res_zh_CH.properties的内容如下:
USD=美元
JPY=日元
下面来看如何用LingualResource来实现多国语:
package cai.milenfan.basic.test; 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 localeCode="en_US"; private static final String FILE_NAME="res"; private static HashMap instances = new HashMap(19); private Locale locale = null; private ResourceBundle resourceBundle = null; private LingualResource lnkLingualResource; private LingualResource(){ } private LingualResource(String language,String region){ this.localeCode = language; this.region = region; localeCode = makeLocaleCode(language,region); locale=new Locale(language,region); resourceBundle = ResourceBundle.getBundle(FILE_NAME,locale); instances.put(makeLocaleCode(language,region),resourceBundle); } //返回一个Locale代码 private static String makeLocaleCode(String language,String region){ return language + "_" + region; } public synchronized static LingualResource getInstance(String language,String region){ if(instances.containsKey(makeLocaleCode(language,region))){ return (LingualResource)instances.get(makeLocaleCode(language,region)); }else{ return new LingualResource(language,region); } } public String getLocaleString(String key){ return resourceBundle.getString(key); } }
客户端测试程序如下:
package cai.milenfan.basic.test; public class LongualResourceTester { public static void main(String[] args){ //LingualResource ling = LingualResource.getInstance("en","US"); LingualResource ling = LingualResource.getInstance("zh","CN"); String usDollar = ling.getLocaleString("USD"); System.out.println("USD=" + usDollar); } }
为什么国际化又叫做i18n?
这是一个有趣的问题,因为国际的英文单词是Internationalization,第一个字母i和最后一个字母n之间有18个字母,因此取名为i18n.
发表评论
-
Mina重连
2014-05-26 21:29 2927import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6431.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 623一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 809安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1252使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 483ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1177http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 913不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 890http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 507http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 996http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 692http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 604http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 814http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 975http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 437http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 592http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 839当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 1024目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
实用的 java 设计原则 和 设计模式,阅读完本书,可以了解java的api背后的设计思想和理念...第17章 专题:多例\(Multiton\)模式与多语言支持 第18章 专题:序列键生成器与单例及多例模式 第19章 建造\(Builder\)模式
第17章 专题:多例(Multiton)模式与多语言支持 第18章 专题:序列键生成器与单例及多例模式 第19章 建造(Builder)模式 第20章 原始模型(Prototype)模式 第21章 专题:JavaBean的“冷藏”和“解冻” 第四部分 ...
com.javapatterns.singleton.mxrecord 专题:单例模式与MX记录 com.javapatterns.multilingual 专题:多例模式与多语言支持 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 ...
3. 强大的社区支持:Python拥有一个活跃的社区,能够提供大量的库和框架以供开发者使用。 4. 广泛应用:Python在人工智能、大数据分析等领域中应用广泛,已经成为许多高校编程课程的基础工具。 三、“MOOC+翻转课堂...
此类模式特别适合于一个类的接口需要被多个类使用时,但这种模式不适用于不支持多重继承的编程语言。在代码实现中,Usb2VgaAdapter类继承了UsbImpl类,实现了Vga接口,这样就成功地将USB接口转换成了VGA接口。 对象...
关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...
本文将详细讲解如何在iOS项目中实现多语言切换,并以"iOS开发多语言切换Demo"为例进行深入探讨。 首先,我们要了解iOS系统如何处理本地化。苹果提供了强大的本地化框架,使得开发者可以轻松地为应用程序添加多种...
- **促进团队沟通**:统一的语言和模式使得团队成员能够更高效地理解和讨论设计方案。 - **减少重复工作**:利用现有模式可以避免重新发明轮子,节省时间和精力。 - **深入理解面向对象编程**:掌握设计模式有助于更...
- **定义**:多例模式是一种创建型设计模式,它表示一组相关对象实例的创建方式,确保同一类的不同实例具有不同的标识。 - **目的**:确保一个类可以拥有多个实例,但每个实例都具有唯一的标识。 - **应用场景**:当...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。...通过学习提供的文档和示例,如"二十三种设计模式.doc"和"java~100例",可以深入理解并掌握这些设计模式的实际应用。
**多例模式(Multiton Pattern)** - **定义**:类似单例模式,但允许有多个实例。 - **应用场景**:当需要控制某个类的实例数量时。 - **实例**:在分布式环境中,为了减少网络传输成本,可能会限制某些资源的...
以C#为例,这是一种优秀的支持面向对象编程的语言,它提供了多种级别的封装支持,支持单实现继承加上多接口实现,同时支持抽象方法和虚方法重写等功能。通过这些特性,C#使得开发者能够更容易地构建面向对象的系统。...
- **4.4 为什么使用设计模式——从Singleton模式谈起**:解释了设计模式的重要性,并以单例模式为例进行了详细的分析。 #### 5. 附录 - **5.1 关于设计模式的思考**:这部分内容包含了作者对于设计模式的一些思考...
享元模式运用共享技术有效支持大量细粒度对象,减少内存中对象的实例数量;代理模式为其他对象提供一种代理以控制对这个对象的访问,可以在不修改原有对象的情况下增加新的功能。 这些设计模式不仅适用于Java、C++...
根据提供的文件信息,我们可以推断出这是一份关于获取《Java与模式》这本书PDF版本的资源分享。然而,为了满足您对于详细知识点的需求,我们将会围绕《Java与模式》这一主题进行深入探讨,涵盖该书可能涉及的重要...
单例模式: 而且自行实例化并向整个系统提供这个实 单例模式 单例模式确保某一个类只有一个实例, 例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 结构型模式 6、ADAPTER —在朋友聚会上碰到...
C++是一种强大而灵活的编程语言,适用于实现各种设计模式。"c++23种设计模式"这本书涵盖了软件工程中广泛使用的一些核心模式。下面将详细讨论这23种设计模式及其在C++中的应用。 1. 单例模式:确保一个类只有一个...
以“互联网环境下高职翻转课堂教学模式的构建与实践——以Java语言程序设计课程为例”为主题,我们可以深入探讨如何利用现代信息技术改革传统教学模式,提升教学质量。翻转课堂是一种颠覆性的教学策略,它将传统的...
《Head First设计模式》是一本深受开发者喜爱的设计模式入门书籍,中文版的出现使得更多中国读者能够轻松理解和掌握这一领域的知识。设计模式是软件工程中的一种最佳实践,它描述了在特定上下文中解决常见问题的经验...