打字猴:1.700456993e+09
1700456993 设计模式之禅 [:1700453936]
1700456994 设计模式之禅 7.4 单例模式的扩展
1700456995
1700456996 如果一个类可以产生多个对象,对象的数量不受限制,则是非常容易实现的,直接使用new关键字就可以了,如果只要有一个对象,使用单例模式就可以了,但是如果要求一个类只能产生两三个对象呢?该怎么实现?我们还以皇帝为例来说明。
1700456997
1700456998 一般情况下,一个朝代的同一个时代只有一个皇帝,那有没有出现两个皇帝的情况呢?确实有,就出现在明朝,那三国期间的算不算?不算,各自称帝,各有各的地盘,国号不同。大家还记得《石灰吟》这首诗吗?作者是谁?于谦。他是被谁杀死的?明英宗朱祁镇。对,就是那个在土木堡之变中被瓦刺俘虏的皇帝,被俘虏后,他弟弟朱祁钰当上了皇帝,就是明景帝,估计刚当上皇帝乐疯了,忘记把他哥哥朱祁镇升级为太上皇,在那个时期就出现了两个皇帝,这期间的的大臣是非常郁闷的,为什么呀?因为可能出现今天参拜的皇帝和昨天的皇帝不相同,昨天给那个皇帝汇报,今天还要给这个皇帝汇报一遍,该情况的类图如图7-3所示。
1700456999
1700457000
1700457001
1700457002
1700457003 图7-3 多个皇帝类图
1700457004
1700457005 这个类图看起来还算简单,但是实现就有点复杂了。Emperor类如代码清单7-5所示。
1700457006
1700457007 代码清单7-5 固定数量的皇帝类
1700457008
1700457009 public class Emperor{
1700457010
1700457011 //定义最多能产生的实例数量
1700457012
1700457013 private static int maxNumOfEmperor=2;
1700457014
1700457015 //每个皇帝都有名字,使用一个ArrayList来容纳,每个对象的私有属性
1700457016
1700457017 private static ArrayList<String>nameList=new ArrayList<String>();
1700457018
1700457019 //定义一个列表,容纳所有的皇帝实例
1700457020
1700457021 private static ArrayList<Emperor>emperorList=new ArrayList<Emperor>();
1700457022
1700457023 //当前皇帝序列号
1700457024
1700457025 private static int countNumOfEmperor=0;
1700457026
1700457027 //产生所有的对象
1700457028
1700457029 static{
1700457030
1700457031 for(int i=0;i<maxNumOfEmperor;i++){
1700457032
1700457033 emperorList.add(new Emperor(“皇”+(i+1)+“帝”));
1700457034
1700457035 }
1700457036
1700457037 }
1700457038
1700457039 private Emperor(){
1700457040
1700457041 //世俗和道德约束你,目的就是不产生第二个皇帝
1700457042
[ 上一页 ]  [ :1.700456993e+09 ]  [ 下一页 ]