多例模式:有上限的多例模式(没上限的多例模式太容易了,和你直接new一个对象没啥区别,不讨论)
/**
* Created by xpeng on 2018/5/1.
* 有时候当皇帝的是儿子其实还有一个太上皇啊
* 有上限的多例模式(没上限的多利模式太容易了,跟new个对象没啥区别)
*/
public class Emperor {
private static int maxNumOfEmperor = 2;//皇上和太上皇
private static ArrayList emperorInfoList = new ArrayList(maxNumOfEmperor);//皇帝的具体名字
private static ArrayList emperorList = new ArrayList(maxNumOfEmperor);//装皇帝的列表
private static int countNumOfEmperor = 0;//正在被人尊称的那个皇帝
//先把2个皇帝产生出来
static {
//把所有皇帝都产生出来
for (int i = 0 ;i<maxNumOfEmperor;i++){
emperorList.add(new Emperor("皇"+(i+1)+"帝"));
}
}
//就这么多皇帝,不允许再推举一个皇帝(new 一个皇帝)
private Emperor(){
//不能产生第二个皇帝
}
private Emperor(String info){
emperorInfoList.add(info);
}
public static Emperor getInstance(){//如果皇帝没有定义,那就定义一个
Random random = new Random();
countNumOfEmperor = random.nextInt(maxNumOfEmperor);//随机拉一个皇帝出来
return (Emperor) emperorList.get(countNumOfEmperor);
}
public static Emperor getInstance(int i){
return (Emperor) emperorList.get(i);
}
//皇帝的名字
public static void emperorInfo(){
Log.e("xyz"," 我是皇帝*** "+emperorInfoList.get(countNumOfEmperor));
}
}
大臣参拜
int ministerNum = 10;//十个大臣
for (int i = 0;i<ministerNum;i++){
if (i==1){
Emperor emperor1 = Emperor.getInstance(0);
Log.e("xyz"," 第二位大臣只参拜一个皇帝" );
emperor1.emperorInfo();
}else{
Emperor emperor = Emperor.getInstance();
Log.e("xyz"," 第 "+(i+1)+"个大臣参拜的是:");
emperor.emperorInfo();
}
}
有的大臣不事二主,只拜一个,需要getInstance(param)指定咯。