一、多例模式的定义
多例模式(Multiton Pattern):实际上就是单例模式的自然推广,属于对象创建类型的模式,多例模式其实就是限制了对象的数量,并且有可能对对象进行重复使用
特点:
1:多例可以有多个实例
2: 多例类必须能够自我创建并管理自己的实例,并且向外界提供自己的实例
二、多例模式的应用场景
在java学习过程中,有一个池子的概念一直存在,好比作线程池,数据库连接池,这个池子是用来对线程,或者数据库连接对象进行管理的,第一,限制了池子中的对象数量,第二就是能够在使用过程中达到复用的效果,线程中的线程在执行完毕后,不会被直接回收掉,而会切换成等待状态,等待下一个任务提交,执行。数据库连接池也是如此,数据库操作在连接的时候,如果对数据库操作完毕后,会把资源释放,然后等待下一个数据库操作进行连接。这种设计其实是将对象的应用最大化了,避免了每次连接的时候都需要去创建一个对象。造成对象冗余或者内存升高。
三、多例模式的类图UML
四、多例模式demo示例
案例一
首先讲一个历史故事,明朝有一段时期曾经出现两个皇帝,明英宗朱祁镇,在土木堡之变中被瓦刺俘虏,被俘虏后,他弟弟朱祁钰当上了皇帝,就是明景帝,估计当上皇帝后乐疯了,忘记把老哥朱祁镇削为太上皇了,在中国的历史上就这个时期是有 2 个皇帝,你说这期间的大臣多郁闷,两个皇帝耶,两个精神依附对象呀。
首先根据上述我们画出类图:
编写实现代码
import java.util.ArrayList;
import java.util.Random;
/**
* 只能产生两个对象,即两个皇帝。
* */
public class Emperor {
private static int maxNumberOfEmperor = 2;//最多有两个皇帝
private static ArrayList<String> emperorInfoList = new ArrayList<String>(maxNumberOfEmperor);//存放皇帝的名字
private static ArrayList<Emperor> emperorList = new ArrayList<Emperor>(maxNumberOfEmperor);//存放两个皇帝
private static int countNumberOfEmperor = 0;//当前被尊重的皇帝
//先把皇帝产出来
static {
for(int i = 0 ; i < maxNumberOfEmperor; i++){
emperorList.add(new Emperor("皇"+(i+1)+"帝"));
}
}
//无参构造器
private Emperor() {
}
//带参构造器,传入皇帝的名字
private Emperor(String info) {
emperorInfoList.add(info);
}
//随机取出一个皇帝。
public static Emperor getInstance(){
Random random = new Random();
countNumberOfEmperor = random.nextInt(maxNumberOfEmperor);
return emperorList.get(countNumberOfEmperor);
}
//获取当前皇帝的名字
public static String emperorInfo(){
return emperorInfoList.get(countNumberOfEmperor);
}
}
public class Minister {
public static void main(String[] args) {
int minister = 10;//有十个大臣
for(int i = 0 ; i < minister ; i++){
Emperor emperor = Emperor.getInstance();
System.out.println("第"+(i+1)+"个大臣参拜的是:" + emperor.emperorInfo());
}
}
}
输出结果为:
第1个大臣参拜的是:皇1帝
第2个大臣参拜的是:皇1帝
第3个大臣参拜的是:皇2帝
第4个大臣参拜的是:皇1帝
第5个大臣参拜的是:皇2帝
第6个大臣参拜的是:皇2帝
第7个大臣参拜的是:皇2帝
第8个大臣参拜的是:皇1帝
第9个大臣参拜的是:皇2帝
第10个大臣参拜的是:皇1帝
五、多例模式的优缺点
优点:
1.提高对象的复用性,降低内存消耗,提高应用的性能。