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 ]
[
下一页 ]