多例模式

       多例模式的特点
       
所谓多例模式(Multiton Pattern),实际上就是单例模式的推广,作为对象的创建模式,多例模式或多例类有以下特点:
      1.多例类可以有多个实例。
      2.多例类必须自己创建、管理自己的实例,并向外提供给自己的实例。
      单例类一般情况下最多只有一个实例,但是单例模式的精神是允许有限个实例的,并不仅是允许一个实例,这种允许有限多个实例并向怎么jvm提供自己实例的类叫多例类,这种模式叫多例模式。
      有上限多例类
     
一个实例数目有上限的多例类,已经把实例上限做为类的逻辑的一部分,并建造了多例类的内部,这种多例模式叫做有上限多例模式。
      例如:每一副麻将都需要两个骰子,因此骰子就应该是双态类,以此系统为例,说明有上限多例模式。骰子类图如下:
                                       

      多例类die的源码如下:

package com.model.builder.multiton;

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;
	}
	
	public synchronized int dice(){
		
		Date da = new Date();
		Random ran = new Random(da.getTime());
		int value = ran.nextInt();
		value = Math.abs(value);
		value = value%6;
		value += 1;
		return value;
	}
}
      在多例类Die中,使用了饿汉方式创建了连个die 的实例,根据静态工厂方法的参数,工厂方法返回两个实例中的一个,Die类中的die()方法代表骰子,这个方法还好返回一个1-6之间的随即数,Client.java 源代码如下:
package com.model.builder.multiton;

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();
	}
}
     由于有上限的多例类对实例的数目有上限,因此有上限的多例类在上限等于1时,就是单例模式,因此多例就是单例的推广,单例是多例的特例。
     一个有上限的多例类可以使用静态变量存储所有的实例,特别是在实例数目不多的时候,可以使用一个个的静态变量存储一个个的实例,在数目比较多的时候就要考虑使用静态的集合存储这些实例。
     无上限的多例模式
    
实例数目没有上限的多例模式叫做无上限多例模式。由于事先不知道要创建多少个实例,因此必须使用集合管理所有实例。
      有状态和没有状态的多例类
      
如题单例类可以分为有状态和没有状态的两种一样,多例类也    可以分成有状态的和没状态的两种。
      多例对象的状态如果是可以在加载后改变的,那么这种多例对象叫做可变多例对象,如果在加载后多例对象的状态不可以改变,那么这种多例实例对象叫做不可变多例对象。

转载于:https://my.oschina.net/gao0516/blog/114501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值