`
java苹果+番茄
  • 浏览: 67979 次
  • 性别: 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"));
			}
		}
分享到:
评论

相关推荐

    单例多例模式

    "单例多例模式" 单例多例模式是软件设计中的一种重要概念,它们之间的区别和选择对系统的性能和稳定性有着重要的影响。本文将详细讲解单例多例模式的定义、产生方式、使用场景和选择标准。 一、什么是单例多例? ...

    设计模式之创建型模式

    创建型模式作为设计模式的五种主要类别之一,它主要关注的是对象的创建过程,通过抽象和封装创建过程中的变化点,使得系统能够更加灵活地应对未来的变化。 创建型模式包括多种不同的模式,例如工厂模式、单态模式、...

    软件设计模式之创建模式例子

    压缩包中的“创建模式”文件可能包含了对以上各种模式的详细解释、示例代码以及实际应用案例,对于理解并掌握这些创建型设计模式有着重要的参考价值。通过学习和实践,开发者可以更好地设计出可扩展、易维护的系统。

    游戏角色创建程序(单例模式)

    4. 线程安全措施:如使用synchronized关键字或Java 5后的`java.util.concurrent`包中的`AtomicReference`来保证多线程环境下的正确性。 通过这种方式,游戏开发者可以确保在任何情况下,角色创建都是有序进行的,...

    Java设计模式之禅

    4. 多例模式(Multiton Pattern):与单例模式相似,但允许多个实例存在。 5. 工厂方法模式(Factory Method Pattern):定义了一个创建对象的接口,但让子类决定实例化哪一个类。 6. 抽象工厂模式(Abstract ...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...

    (创建型模式)Singleton模式

    Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...

    java设计模式

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

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    例如,一个Web应用可能采用MVC模式组织结构,使用单例模式管理数据库连接,同时通过工厂模式创建不同类型的业务对象,而代理模式可以用来添加事务处理等额外功能。通过学习和熟练掌握这些设计模式,开发者能够更好地...

    重学java的设计模式

    5. 原型模式:通过复制已有对象来创建新对象,减少创建新对象的成本。 接下来是结构型模式,它们关注如何组合现有的类和对象以创建更大的结构。结构型模式包括适配器模式、装饰器模式、代理模式、桥接模式、组合...

    java设计模式pdf

    - **工厂模式**(第17页):这种模式提供了一个创建对象的接口,但允许子类决定实例化哪一个类。它使得一个类的实例化延迟到其子类。通过示例代码展示了工厂模式的基本工作原理。 - **抽象工厂模式**(第26页):这...

    五种常用的Java设计模式

    建造模式主要有两种实现方式,第一种方式是使用Director类来控制创建过程,第二种方式是使用Builder类来控制创建过程。 Observer模式 Observer模式是一种行为型设计模式,主要目的是实现对象之间的松耦合。...

    设计模式相关资料设计模式相关资料

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。每种模式都针对不同的设计挑战,旨在优化代码结构,改善类和对象之间的关系。 1. 创建型模式: - 单例模式:确保一个类只有一个实例,并提供全局访问点...

    用生动的例子讲述设计模式

    ### 第5章:工厂方法模式(Factory Method Pattern) #### 概念: 工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 #### 适用场景: - 一个类不知道它所...

    java设计模式ppt

    - **懒汉式**:在第一次使用时才创建实例。 - **饿汉式**:在类加载时就创建实例。 单例模式的应用场景包括管理数据库连接、日志对象等资源。 #### 2. 工厂方法模式 (Factory Method Pattern) 工厂方法模式是一种...

    C#设计模式PDF 电子书

    观察者模式定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。C#中的事件和委托机制就是观察者模式的实现。 七、策略模式(Strategy) 策略模式定义了...

    根据不同的模式创建单实例应用程序(3kb)

    标题"根据不同的模式创建单实例应用程序(3kb)"暗示我们将探讨几种实现单例模式的方法,可能是通过C++语言来完成,文件`SingleInstance.cpp`和`SingleInstance.h`可能包含了这些实现的源代码。 1. **经典单例模式**...

Global site tag (gtag.js) - Google Analytics