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