`
java苹果+番茄
  • 浏览: 65755 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多例模式【创建模式第五篇】

阅读更多
多例模式(Multiton Pattern)
1、多例模式特点:
1) 多例类可有多个实例
2) 多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
//多例类(骰子)
		import java.util.Random;
		import java.util.Date;
		
		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;
			}
		}
		
		//客户端
		public class Client{
			private static Die die1, die2;
			public static void main(String args[]){
				die1 = Die.getInstance(1);
				die2 = Die.getInstance(2);
				die1.dice();
				die2.dice();
			}
		}
		
		//多例类是单例类的推广,而单例类是多例类的特殊情况
		多例类对象的状态如果是可以在加载后改变的,那么这种多例对象叫做可边多例对象;如果多例对象的状态在加载后不可以改变
		那么这种多例对象叫做不变多例对象
		
		//怎样使用Locale对象和ResourceBundle对象
		Locale locale = new Locale("fr", "FR");
		ResourceBundle res = ResourceBundle("shortname",locale);
		res会加载一个名为shortname_fr_FR.properties的Resource文件
		
		//多例类LingualResource
		import java.util.HashMap;
		import java.util.Locale;
		import java.util.ResourceBundle;
		
		public class LingualResource{
			private String language = "en";
			private region = "US";	//region(区域)
			private String localeCode = "en_US";
			private static HashMap instances = new HashMap(19);
			private Locale locale = null;
			private ResourceBundle resourceBundle = null;
			private LingualResource lnkLingualResource;
			
			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);
			}
			
			private LingualResource(){
			}
			
			//工厂方法,返回一个具体的内部状态的实例
			public synchronized static LingualResource getInstance(String language, String region){
				if(makeLocaleCode(language, region)){
					return (LingualResource)makeLocaleCode(language, region);
				}else{
					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;
			}
		}
		
		//makeLocaleCode()是一个辅助性的方法,在传入语言代码和地区代码时,此方法可以返回一个Locale代码
		在getInstance()方法被调用时,程序会首先检查传入的Locale代码是否已经在instances集合中存在,如果已经存在
		即直接返回同它所对应的LingualResource对象,否则就会首先创建一个此Locale代码所对应的LingualResource对象,将之存入
		instances集合,并返回这个实例
		
		//客户端
		public class LingualResourceTester{
			public static void main(String agrs[]){
				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);
			}
		}
		//如果客户是美国客户,那么在jsp网页中可以通过调用getLocalString()方法得到相应的英文说明
		Resource文件res_en_US.properties的内容
		----------------------------------------
				LingualResource ling = LingualResource.getInstance("en", "US");
				String usDollar = ling.getLocaleString("USD");
		----------------------------------------
		返回----US Dollar
		
		中国用户:
		---------------------------------------
				LingualResource lingZh = LingualResource.getInstance("zh", "CH");
				String usDollarZh = lingZh.getLocaleString("USD");
		----------------------------------------
		返回----美元
		
		////////////////////////////////////////////
		为美国英文准备的Resource文件res_en_US.properties的内容如下:
			USD = US Dollar
			JPY = Japanese Yen
		为简体中文准备的Resource文件res_zh_CH.properties的内容如下:
			USD = 美元
			JPY = 日元
			
		=======================问答题=================================
		一个根据语言代码和地区代码将数字格式化的例子
		import java.util.Locale;
		import java.text.NumberFormat;
		
		public class NumberFormatTester{
			public static void displayNumber(Double amount, Locale currentLocale){
				NumberFormat formatter;
				String amountOut;
				formatter = NumberFormat.getNumberInstance(currentLocale);
				amountOut = formatter.format(amount);
				System.out.println(amountOut + "  " + currentLocale.toString());
			}
			
			public static void main(String agrs[]){
				displayNumber(new Double(1234567.89), new Locale("en", "US"));
				displayNumber(new Double(1234567.89), new Locale("de", "DE"));
				displayNumber(new Double(1234567.89), new Locale("fr", "FR"));
			}
		}
		
		一个根据语言代码和地区代码将货币数字格式化的例子
		import java.util.Locale;
		import java.text.NumberFormat;
		
		public class CurrencyFormatTester{
			public static void displayCurrency(Double amount, Locale currentLocale){
				NumberFormat formatter;
				String amountOut;
				formatter = NumberFormat.getCurrencyInstance(currentLocale);
				amountOut = formatter.format(amount);
				System.out.println(amountOut + "  " + currentLocale.toString());
			}
			
			public static void main(String agrs[]){
				displayCurrency(new Double(1234567.89), new Locale("en", "US"));
				displayCurrency(new Double(1234567.89), new Locale("de", "DE"));
				displayCurrency(new Double(1234567.89), new Locale("fr", "FR"));
			}
		} 
		
		一个根据语言代码和地区代码将百分比格式化的例子
		import java.util.Locale;
		import java.text.NumberFormat;
		
		public class PercentFormatTester{
			public static void displayPercent(Double amount, Locale currentLocale){
				NumberFormat formatter;
				String amountOut;
				formatter = NumberFormat.getPercentInstance(currentLocale);
				amountOut = formatter.format(amount);
				System.out.println(amountOut + "  " + currentLocale.toString());
			}
			
			public static void main(String agrs[]){
				displayPercent(new Double(4567.89), new Locale("en", "US"));
				displayPercent(new Double(4567.89), new Locale("de", "DE"));
				displayPercent(new Double(4567.89), new Locale("fr", "FR"));
			}
		}
分享到:
评论

相关推荐

    java设计模式

    第5章 迪米特法则 5.1 迪米特法则的定义 5.2 我的知识你知道得越少越好 5.3 最佳实践 第6章 开闭原则 6.1 开闭原则的定义 6.2 开闭原则的庐山真面目 6.3 为什么要采用开闭原则 6.4 如何使用开闭原则 6.5 最佳实践 第...

    设计模式——基于C#的工程化实现及扩展

    第5篇主要介绍小颗粒度基础模式和应用案例;第6篇主要介绍应用全局的模式化的实现方法,包括现在已经被普遍应用的N层模式及某些关键性框架产品采用的“微内核”模式;第7篇主要是一些针对Web和Web Service领域的模式...

    Delphi模式编程第一分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象工厂模式 ...

    Delphi模式编程第二分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象...

    Python编程实战:运用设计模式、并发和程序库创建高质量程序(全球资深Python专家Doug Hellmann作序推荐,以3个完整的案例。

    《python编程实战:运用...第4章和第5章详细讲解了python的高级并发技术以及cython的用法; 第6章具体介绍了python的高级网络编程; 第7章阐释了如何用tkint er开发图形用户界面; 第8章讲解了如何用opengl绘制3d图形。

    《设计模式实训教程》【PPT+类图与代码+样章】

    第5章行为型模式实训 5.1知识讲解 5.1.1行为型模式概述 5.1.2职责链模式 5.1.3命令模式 5.1.4解释器模式 5.1.5迭代器模式 5.1.6中介者模式 5.1.7备忘录模式 5.1.8观察者模式 5.1.9状态模式 5.1.10策略...

    设计模式可复用面向对象软件的基础.zip

    第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 ...

    C#23种设计模式_示例源代码及PDF

    原始模型模式: 原始模型模式 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原 型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类, 产品 类不需要非得有任何事先...

    设计模式:可复用面向对象软件的基础 书和源码

    《设计模式:可复用面向对象软件的基础》是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年设计经验的结晶。...第五章 行为模式 第六章 结论 附录A 词汇表 附录B 图示符号指南 附录C 基本类 参考文献

    C#设计模式 C# Design Patterns:A Tutorial

    第5章 继承 · · · · · · (更多) 第一部分 C#面向对象程序设计 第1章 设计模式概述 第2章 C#语言的语法 第3章 用C#编写Windows程序 第4章 在C#中使用类和对象 第5章 继承 第6章 UML图 第7章 C#中的数组、文件...

    设计模式 GOF 23

    第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 ...

    设计模式--C++

    第 3 章 创建型模式 54 3.1 Abstract Factory(抽象工厂)—对象创建型模式 57 3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型...

    JavaScript模式中文[pdf] 百度云

     第5章 对象创建模式  命名空间模式  声明依赖关系  私有属性和方法  模块模式  沙箱模式  静态成员  对象常量  链模式  method()方法  小结  第6章 代码复用模式  传统与现代继承模式的比较  使用类...

    设计模式:可复用面向对象软件的基础--详细书签版

    第5章 行为模式 147 5.1 chain of responsibil ity(职责链) —对象行为型模式 147 5.2 command(命令)—对象行为型 模式 154 5.3 interpreter(解释器)—类行为型 模式 162 5.4 iterator(迭代器)—对象...

    设计模式(.PDF)

    第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 ...

    第5章_工厂方法模式.ppt

    在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须...

    GOLF设计模式(C++语言版)

    第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象...

    ActionScript 3.0设计模式扫描版_方红琴译

    第Ⅱ部分 创建模式 第2章 工厂方法模式 什么是工厂方法模式? ActionScript 3.0中的抽象类 工厂方法最小化示例 隐藏产品类 .实例:打印商店管理程序 实例扩展:彩色打印 工厂方法模式中关键的00P概念 ...

    Ruby设计模式(中文版+英文版).pdf

     第1章使用设计模式创建更好的程序  第2章从ruby起步 第二部分ruby中的模式  第3章使用模板方法变换算法  第4章使用策略替换算法  第5章通过观察器保持协调  第6章使用组合模式将各部分组成整体  第7章通过...

    深入PHP面向对象、模式与实践 (第2版)

    目录: 第一部分 介绍第1章 PHP:设计与管理第二部分 对象第2章 PHP与对象第3章 对象基础第4章 高级特性第5章 对象工具第6章 对象与设计第三部分 模式第7 章 什么是设计模式?为何使用它们第8章 模式原则第9章 生成...

Global site tag (gtag.js) - Google Analytics