java 设计模式之:多例(Multiton)模式

多例(Multiton)模式

 


        作为对象的创建模式,多例模式中的多例类可以有多个实例,而且多例类必须自己创建,管理自己的实例,并向外界提供自己的实例。

 案例:国际化解决方案

实际方案是分层方案,即MVC模式。MVC模式将系统分为多个层次。
也就是说,系统的内核可以是纯英文的。在内核外部增加一个壳层负责语言的翻译工作。
所谓系统内核就是系统的模型,而翻译壳层便是视图的一部分,对多语言的支持属于视图功能,因此,不应该在内核解决,应当在视图解决。
多例模式的特点:
所谓多例(Multiton Pattern)实际上就是单例模式的自然推广。作为对象的创建模式,多例模式或多例类有以下的特点:
1、多例类可以有多个实例
2、多例类必须自己创建,管理自己的实例,并向外界提供自己的实例。
这种允许有限个实例并向整个JVM提供自己实例的类叫做多例类,这种模式叫做多例模式
本例就使用多例模式来实现消息资源对象,需要构造出能提供有限个实例,每个实例有个不相同的属性(即Locale代码)的代码。(还记得Struts中的国际化吗?不记得就先看书复习一下吧!!^_^)
有上限的多例类已经吧实例的上限当作逻辑的一部分,并建造到了多例类的内部,这种多例模式叫做有上限多例模式。
比如每一麻将局都有两个骰子,因此骰子就应当是双态类,这里就以这个系统为例,说明多例模式的结构。
import java.util.Random;
import java.util.Date;

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;//对6取模
    value +=1;//由于 value的范围是0-5,所以value+1成为1-6
    return value;
   }
}

/**
 *测试的客户端,投掷骰子
 */
public class DieClient
{
 private static Die die1,die2;
 
 public static void main(String[] args)
 {
  die1 = Die.getInstance(1);
  die2 = Die.getInstance(2);
  
  System.out.println(die1.dice());
  System.out.println(die2.dice());
 }
}
由于有上限的多例类对实例的数目有上限,因此有上限的多例类在这个上限等于1时,多例类就回到了单例类,因此多例类时单例类的推广,而单例类时多例类的特殊情况。
一个有上限的多例类可以使用静态变量存储所有的实例,特别时在实例数目不多的时候,可以使用一个个的静态变量存储一个个的实例。在数目较多的时候,就需要使用静态聚集存储这些实例。

无上限多例模式
实例数目没有上限的多例模式叫无上限多例模式。
由于没有上限的多例类对实例的数目是没有限制的,因此,虽然这种多例模式是单例模式的推广,但是这种多例类并不一定能够回到单例类。
由于事先不知道要创建多少个实例,因此,必然使用聚集管理所有的实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值