一、什么是多例模式?
多例模式的定义与使用皆可以通过单例模式类推。 作为对象的创建模式,多例模式中的多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。 所谓的多例模式(Multiton Pattern),实际上就是单例模式的自然推广。
二、多例模式实例
看过大明风华的应该都知道明英宗和明景帝同时在位了一个月的时间
我们直接写出两个皇帝
package com.trf.pattern.multition.multition1;
import java.util.ArrayList;
import java.util.Random;
/**
* @author 小小唐
* @Date 2022/5/9-星期一-23:37
* 多例模式:实例-->二帝同时在位
* 同一时间出现两个皇帝,大明风华中的明英宗和明景帝(也是会出现混乱,通常程序设计都不用)
*/
@SuppressWarnings("all")
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;//正在被人遵称的那个皇帝
//先把两个皇帝产生出来
static {
//把所有的皇帝都产生出来
for (int i = 0; i < maxNumOfEmperor; i++) {
emperorList.add(new Emperor((i+1)+"号皇帝"));
}
}
//限制其他皇帝的出现
private Emperor(){
//国家已经出现混乱,不能再出现其他皇帝了
}
public 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 void emperorInfo(){
System.out.println(emperorInfoList.get(countNumOfEmperor));
}
}
再来测试一下
package com.trf.pattern.multition.multition1;
/**
* @author 小小唐
* @Date 2022/5/9-星期一-23:57
* 随便找个皇帝请安就可
*/
@SuppressWarnings("all")
public class Minister {
public static void main(String[] args) {
int ministerNum = 10;//10个大臣
for (int i = 0; i < ministerNum; i++) {
Emperor emperor = Emperor.getInstance();
System.out.println("第"+(i+1)+"个大臣参拜的是:");
emperor.emperorInfo();
}
}
}
总结:
多例模式其实没什么好讲的,实际的程序开发中,会不用或禁用它,因为它会使得程序出现混乱等许多问题。