多例模式
多例模式实际上就是单例模式的推广,多例模式又划分为有上限多例模式和无上限多例模式两种,有上限多例模式中的多例类的实例是有上限的,当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类;而对于无上限多例模式中的多例类,它的上限是没有限制的,也就是说它的上限数值是不确定的,这个多例类并不一定能够退化成单例类;
单例模式与多例模式一般性结构:
多例模式特点:
- 多例类可以有多个实例
- 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例
多例类的一个实例,比如:一副麻将都需要有两颗骰子,在没有特别意外发生的情况下,这副麻将打多少圈用的都将是这两颗骰子,两颗骰子代表的是不同的两个状态,
这里可以将骰子设计成多例类,如图:
多例类: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; } }
客户端测试类: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); } }
不忘初心,方得始终