④设计模式之多例模式
同一时期有两个皇帝的情况确实存在,就出现明朝。明英宗朱祁镇,对,就是那个在土木堡之变中被瓦刺俘虏的皇帝,被俘虏后,他弟弟朱祁钰当上了皇帝,就是明景帝,估计当上皇帝后乐疯了,忘记把老哥朱祁镇削为太上皇了,在中国的历史上就这个时期是有两个皇帝的,你说这期间的大臣多郁闷,两个皇帝耶。
这个场景放到我们设计模式中就是叫有上限的多例模式(没有上限的多例模式太容易的,和你直接new一个对象没啥差别,不讨论)怎么实现呢,先看类图
再看看程序
package cn.cjm.Mutipletons;
import java.util.ArrayList;
import java.util.Random;
public class Emperor {
private static int maxNumOfEmperor = 2;//最多只能有两个皇帝
private static ArrayList<String> emperorInfoList = new ArrayList<>(maxNumOfEmperor);//装皇帝的名字
private static ArrayList<Emperor> emperorList = new ArrayList<>(maxNumOfEmperor);// 装皇帝的列表
private static int countNumOfEmperor = 0;// 正在被人尊称的是哪个皇帝
// 创建两个皇帝
static {
for(int i =0;i<maxNumOfEmperor;i++){
emperorList.add(new Emperor("第"+(i+1)+"个皇帝"));
}
}
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 static void emperorInfo(){
System.out.println(emperorInfoList.get(countNumOfEmperor));
}
}
再看看大臣
/**
* 大臣们就比较悲催了,一个皇帝都伺候不过来,现在还来了俩
* TND,不管了,随便找个磕头就跑
* <p>Title:Minster </p>
* <p>Description: </p>
* @author cjm
* @date 2017年9月2日 上午10:05:44
*/
public class Minster {
public static void main(String[] args) {
int minsterNum = 10;
for(int i=0;i<minsterNum;i++){
Emperor emperor = Emperor.getInstance();
System.out.println("第"+(i+1)+"个大臣参拜的是:");
emperor.emperorInfo();
}
}
}
那各位看官就可能会不屑了:有的大臣课时有骨气,只拜一个真神,你怎么处理?这个问题太简单了,懒得详细回答你,getInstance(param)是不是就解决了这个问题?!自己思考,太简单了
public static Emperor getInstance(int numOfEmperor){
if(numOfEmperor>0 && numOfEmperor <maxNumOfEmperor){
return emperorList.get(numOfEmperor);
}
else return null;
}