当前位置: 首页 > 图灵资讯 > 技术篇> 《设计模式之禅》Multition_Pattern--多例模式

《设计模式之禅》Multition_Pattern--多例模式

来源:图灵教育
时间:2023-05-26 09:38:05

多例模式

嘿,我们的书接上来了。单例模式是每次只能有一个例子,所以多例模式可以有多个例子对象。

这种事情在中国历史上发生过吗?嘿,别说了,它真的出现在明朝。三国时期的不算,不算,各自称帝,各有地盘,国号不一样。你还记得那首诗《石灰吟》吗?作者是谁?于谦,他是谁杀的?明英宗朱祁镇,是的,是土木堡变革中被瓦刺俘虏的皇帝。我愿意称之为瓦拉战神。被俘后,他的弟弟朱祁钰成了皇帝,也就是明景皇帝。估计当了皇帝之后,他很开心,没有把弟弟朱祁镇砍成太上皇帝。没完没了,两个皇帝争权。在中国历史上,这一时期有两位皇帝。

在我们的设计模式中,这个场景被称为具有上限的多例模式(没有上限的多例模式太容易了,这与您直接new的对象没有什么不同,也没有讨论)如何实现它。看看我的动作,先看类图:

《设计模式之禅》Multition_Pattern--多例模式_实例化

看看代码皇帝

 

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循环中,一个皇帝的对象每次都是实例化的。在皇帝的代码中,我们可以看到实例化的数量是有限的,所以我们建立了一个有上限的多种模式

《设计模式之禅》Multition_Pattern--多例模式_多例模式_02

总结

看官可能会不屑一顾:有些大臣有骨气,只崇拜一个真神。你怎么处理?这个问题太简单了,懒得详细回答你。getInstance(param))这个问题解决了吗?