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