1700474641
❑提供客户端访问的接口
1700474642
1700474643
我们要提供一个接口供客户端访问,池中有可用对象时,可以直接从池中获得,否则建立一个新的对象,并放置到池中。
1700474644
1700474645
设计思路有了,那我们池中对象的标准是什么呢?你想想看,如果你把所有的对象都放到池中,那还有什么意义?内存早就给你撑爆了!这么多对象,必然有一些相同的属性值,如几十万SignInfo对象中,考试科目就4个,考试地点也就是30多个,其他的属性则是每个对象都不相同的,我们把对象的相同属性提取出来,不同的属性在系统内进行赋值处理,是不是就可以建立一个池了?话无须多说,我们以类图来表示,如图28-2所示。
1700474646
1700474647
1700474648
1700474649
1700474650
图28-2 增加对象池的类图
1700474651
1700474652
做一个很小的改动,增加了一个子类,实现带缓冲池的对象建立,同时在工厂类上增加了一个容器对象HashMap,保存池中的所有对象。我们先来看产品子类,如代码清单28-4所示。
1700474653
1700474654
代码清单28-4 带对象池的报考信息
1700474655
1700474656
public class SignInfo4Pool extends SignInfo{
1700474657
1700474658
//定义一个对象池提取的KEY值
1700474659
1700474660
private String key;
1700474661
1700474662
//构造函数获得相同标志
1700474663
1700474664
public SignInfo4Pool(String_key){
1700474665
1700474666
this.key=_key;
1700474667
1700474668
}
1700474669
1700474670
public String getKey(){
1700474671
1700474672
return key;
1700474673
1700474674
}
1700474675
1700474676
public void setKey(String key){
1700474677
1700474678
this.key=key;
1700474679
1700474680
}
1700474681
1700474682
}
1700474683
1700474684
很简单,就是增加了一个key值,为什么要增加key值?为什么要使用子类,而不在SignInfo类上做修改?好,我来给你解释为什么要这样做,我们刚刚已经分析了所有的SignInfo对象都有一些共同的属性:考试科目和考试地点,我们把这些共性提取出来作为所有对象的外部状态,在这个对象池中一个具体的外部状态只有一个对象。按照这个设计,我们定义key值的标准为:考试科目+考试地点的复合字符串作为唯一的池对象标准,也就是说在对象池中,一个key值唯一对应一个对象。
1700474685
1700474686
注意 在对象池中,对象一旦产生,必然有一个唯一的、可访问的状态标志该对象,而且池中的对象声明周期是由池容器决定,而不是由使用者决定的。
1700474687
1700474688
你可能马上就要提出了,为什么不建立一个新的类,包含subject和location两个属性作为外部状态呢?嗯,这是一个办法,但不是最好的办法,有两个原因:
1700474689
1700474690
❑修改的工作量太大,增加的这个类由谁来创建呢?同时,SignInfo类是否也要修改呢?
[
上一页 ]
[ :1.700474641e+09 ]
[
下一页 ]