设计模式之多例模式

84 阅读1分钟

案例:皇帝,在单例模式案例中,我们说中国历朝历代,很少出现两个皇帝并存的时候,所以把皇帝看作是一个单例。但也有个别例外情况,明朝就同时存在过两个皇帝,明英宗和明景帝,下面就用这个案例来介绍有上限的多例模式。(无上限的多例模式就是直接new多个实例对象)

类图:

代码:

public class Emperor {

    // 最多只能有两个皇帝
    private static int maxNumOfEmperor = 2;
    
    // 皇帝的基本信息
    private static List<String> emperorInfoList = new ArrayList<>(maxNumOfEmperor);
    
    // 装皇帝实例的列表
    private static List<Emperor> emperorList = new ArrayList<>(maxNumOfEmperor);
    
    // 正被人尊称的是哪个皇帝
    private static int countNumOfEmperor = 0;

    // 先把两个皇帝生产出来
    static {
        // 把所有的皇帝都生产出来
        for(int i = 0; i < maxNumOfEmperor; i++) {
            emperorList.add(new Emperor("皇帝" + i));
        }
    }

    // 私有构造器,不需要客户端直接new一个对象
    private Emperor() {}

    private Emperor(String info) {
        emperorInfoList.add(info);
    }

    public static Emperor getInstance() {
        Random random = new Random();
        // 随机
        countNumOfEmperor = random.nextInt(maxNumOfEmperor);
        return emperorList.get(countNumOfEmperor);
    }

    // 打印皇帝信息
    public void emperorInfo() {
        System.out.println(emperorList.get(countNumOfEmperor));
    }
    
}

/**
 * @Description: 大臣参拜皇帝
 */
public class Minister {

    public static void main(String[] args) {

        // 10个大臣
        int ministerNum = 10;

        for(int i = 0; i < ministerNum; i++) {
            Emperor emperor = Emperor.getInstance();
            System.out.print("第" + (i + 1) + "个大臣参拜的皇帝是:" + "\t") ;
            emperor.emperorInfo();
        }

    }

}

这样就实现了有上限的多例模式,如果需要返回指定的Emperor对象,只需要重载一个getInstance(int index)方法即可。

本文原书:《您的设计模式》作者:CBF4LIFE