多例模式
嘿,我们的书接上来了。单例模式是每次只能有一个例子,所以多例模式可以有多个例子对象。
这种事情在中国历史上发生过吗?嘿,别说了,它真的出现在明朝。三国时期的不算,不算,各自称帝,各有地盘,国号不一样。你还记得那首诗《石灰吟》吗?作者是谁?于谦,他是谁杀的?明英宗朱祁镇,是的,是土木堡变革中被瓦刺俘虏的皇帝。我愿意称之为瓦拉战神。被俘后,他的弟弟朱祁钰成了皇帝,也就是明景皇帝。估计当了皇帝之后,他很开心,没有把弟弟朱祁镇砍成太上皇帝。没完没了,两个皇帝争权。在中国历史上,这一时期有两位皇帝。
在我们的设计模式中,这个场景被称为具有上限的多例模式(没有上限的多例模式太容易了,这与您直接new的对象没有什么不同,也没有讨论)如何实现它。看看我的动作,先看类图:
看看代码皇帝
import java.util.ArrayList;import java.util.Random;/** * @author LeeZhi * @version 1.0 */@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))); } } ///就这么多皇帝,不允许再推荐一个皇帝(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 void emperorInfo() { System.out.println(emperorInfoList.get(countNumofEmperor)); }}
大臣
事实上,大臣们更悲惨,两个皇帝,两个老子,怎么崇拜啊,不管,只要是皇帝:
/** * @author LeeZhi * @version 1.0 * 大臣们很悲惨。一个皇帝不能伺候他们。现在有两个皇帝 * TNND,不管怎样,找个皇帝,磕头,请按一下! */@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.print("第" + (i + 1) + "参拜大臣的是:"; emperor.emperorInfo(); } }}
在大臣的for循环中,一个皇帝的对象每次都是实例化的。在皇帝的代码中,我们可以看到实例化的数量是有限的,所以我们建立了一个有上限的多种模式
总结看官可能会不屑一顾:有些大臣有骨气,只崇拜一个真神。你怎么处理?这个问题太简单了,懒得详细回答你。getInstance(param))这个问题解决了吗?