多例模式

  多例模式实际上就是单例模式的推广,多例模式又划分为有上限多例模式无上限多例模式两种,有上限多例模式中的多例类的实例是有上限的,当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类;而对于无上限多例模式中的多例类,它的上限是没有限制的,也就是说它的上限数值是不确定的,这个多例类并不一定能够退化成单例类;

单例模式与多例模式一般性结构:

 

多例模式特点:

  1.  多例类可以有多个实例
  2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例

  多例类的一个实例,比如:一副麻将都需要有两颗骰子,在没有特别意外发生的情况下,这副麻将打多少圈用的都将是这两颗骰子,两颗骰子代表的是不同的两个状态,

这里可以将骰子设计成多例类,如图:

 

  多例类:Dice.java

package pattern.multion;
import java.util.Random;
/**
 * -----------------------------------------
 * @描述  骰子有上限多例类
 * -----------------------------------------
 */
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(){
    }
    /**
     * 获取多例类的实例
     */
    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;
    } 

  /**
    * 此方法是线程安全的,调用该方法来掷骰子
    */
    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;
    }
}
View Code

客户端测试类:Mahjong.java

package pattern.multion;
/**
 * @描述  客户端测试类
 */

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);
    }
}
View Code
posted @ 2016-07-12 09:18  简单爱_wxg  阅读(753)  评论(0编辑  收藏  举报