多例模式实际上就是单例模式的推广,多例模式又划分为有上限多例模式和无上限多例模式两种,有上限多例模式中的多例类的实例是有上限的,
当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类;而对于无上限多例模式中的多例类,它的上限是没有限制的,也就是说它的上限数值是不确定的,
这个多例类并不一定能够退化成单例类;
单例模式与多例模式一般性结构:
多例类的一个实例,比如:一副麻将都需要有两颗骰子,在没有特别意外发生的情况下,这副麻将打多少圈用的都将是这两颗骰子,两颗骰子代表的是不同的两个状态,
这里可以将骰子设计成多例类,如图:
多例类:Dice.java
package pattern.multion;
import java.util.Random;
/**
* -----------------------------------------
* @描述 骰子有上限多例类
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-7-31 <p>
* -----------------------------------------
*/
public class Dice {
public static final int INSTANCE1 = 0;
public static final int INSTANCE2 = 1;
private static final Dice DICE_INSTANCE1 = new Dice(); //饿汉式
private static final Dice DICE_INSTANCE2 = new Dice(); //饿汉式
//私有化构造子,阻止外部直接实例化对象
private Dice(){
}
/**
* <B>方法描述:</B>
* <p style="margin-left:20px;color:#A52A2A;">
* 获取多例类的实例
* @param which <span style="color: #008080;"> 取值范围:<BR>
* ① Dice.INSTANCE1:返回Dice的第一个实例对象<BR>
* ② Dice.INSTANCE2:返回Dice的第二个实例对象<BR>
* </span>
* @return <span style="color: #008080;"> 返回Dice的一个实例对象 </span>
*/
public static Dice getInstance(int which){
switch(which){
case INSTANCE1 :
return DICE_INSTANCE1;
case INSTANCE2 :
return DICE_INSTANCE2;
default :
try {
throw new Exception("找不到与参数 " + which + " 相匹配的实例!");
} catch (Exception e) {e.printStackTrace();}
}
return null;
}
/**
* <B>方法描述:</B>
* <p style="margin-left:20px;color:#A52A2A;">
* 此方法是线程安全的,调用该方法来掷骰子
* @return <span style="color: #008080;"> 返回骰子的点数 </span>
*/
public synchronized int roll(){
try {
Random ran = new Random(System.currentTimeMillis());
int rollValue = ran.nextInt();
rollValue %= 6;
Thread.sleep(6);
return rollValue > 0 ? ++rollValue : --rollValue * -1;
} catch (Exception e) {e.printStackTrace();}
return 1;
}
}
客户端测试类:Mahjong.java
package pattern.multion;
/**
* -----------------------------------------
* @描述 客户端测试类
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-7-31 <p>
* -----------------------------------------
*/
public class Mahjong {
private static Dice dice1 = Dice.getInstance(Dice.INSTANCE1),
dice2 = Dice.getInstance(Dice.INSTANCE2);
public static void main(String[] args){
int value1 = dice1.roll();
int value2 = dice2.roll();
System.out.println(value1);
System.out.println(value2);
}
}
[ 转载请:http://www.blogjava.net/fancydeepin ]
当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类;而对于无上限多例模式中的多例类,它的上限是没有限制的,也就是说它的上限数值是不确定的,
这个多例类并不一定能够退化成单例类;
单例模式与多例模式一般性结构:
多例模式特点:
1. 多例类可以有多个实例
2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例
多例类的一个实例,比如:一副麻将都需要有两颗骰子,在没有特别意外发生的情况下,这副麻将打多少圈用的都将是这两颗骰子,两颗骰子代表的是不同的两个状态,
这里可以将骰子设计成多例类,如图:
多例类:Dice.java
package pattern.multion;
import java.util.Random;
/**
* -----------------------------------------
* @描述 骰子有上限多例类
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-7-31 <p>
* -----------------------------------------
*/
public class Dice {
public static final int INSTANCE1 = 0;
public static final int INSTANCE2 = 1;
private static final Dice DICE_INSTANCE1 = new Dice(); //饿汉式
private static final Dice DICE_INSTANCE2 = new Dice(); //饿汉式
//私有化构造子,阻止外部直接实例化对象
private Dice(){
}
/**
* <B>方法描述:</B>
* <p style="margin-left:20px;color:#A52A2A;">
* 获取多例类的实例
* @param which <span style="color: #008080;"> 取值范围:<BR>
* ① Dice.INSTANCE1:返回Dice的第一个实例对象<BR>
* ② Dice.INSTANCE2:返回Dice的第二个实例对象<BR>
* </span>
* @return <span style="color: #008080;"> 返回Dice的一个实例对象 </span>
*/
public static Dice getInstance(int which){
switch(which){
case INSTANCE1 :
return DICE_INSTANCE1;
case INSTANCE2 :
return DICE_INSTANCE2;
default :
try {
throw new Exception("找不到与参数 " + which + " 相匹配的实例!");
} catch (Exception e) {e.printStackTrace();}
}
return null;
}
/**
* <B>方法描述:</B>
* <p style="margin-left:20px;color:#A52A2A;">
* 此方法是线程安全的,调用该方法来掷骰子
* @return <span style="color: #008080;"> 返回骰子的点数 </span>
*/
public synchronized int roll(){
try {
Random ran = new Random(System.currentTimeMillis());
int rollValue = ran.nextInt();
rollValue %= 6;
Thread.sleep(6);
return rollValue > 0 ? ++rollValue : --rollValue * -1;
} catch (Exception e) {e.printStackTrace();}
return 1;
}
}
客户端测试类:Mahjong.java
package pattern.multion;
/**
* -----------------------------------------
* @描述 客户端测试类
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-7-31 <p>
* -----------------------------------------
*/
public class Mahjong {
private static Dice dice1 = Dice.getInstance(Dice.INSTANCE1),
dice2 = Dice.getInstance(Dice.INSTANCE2);
public static void main(String[] args){
int value1 = dice1.roll();
int value2 = dice2.roll();
System.out.println(value1);
System.out.println(value2);
}
}
[ 转载请:http://www.blogjava.net/fancydeepin ]