打字猴:1.700457222e+09
1700457222
1700457223 public void getColor(){
1700457224
1700457225 System.out.println(“白色人种的皮肤颜色是白色的!”);
1700457226
1700457227 }
1700457228
1700457229 public void talk(){
1700457230
1700457231 System.out.println(“白色人种会说话,一般都是但是单字节。”);
1700457232
1700457233 }
1700457234
1700457235 }
1700457236
1700457237 所有的人种定义完毕,下一步就是定义一个八卦炉,然后烧制人类。我们想象一下,女娲最可能给八卦炉下达什么样的生产命令呢?应该是“给我生产出一个黄色人种(YellowHuman类)”,而不会是“给我生产一个会走、会跑、会说话、皮肤是黄色的人种”,因为这样的命令增加了交流的成本,作为一个生产的管理者,只要知道生产什么就可以了,而不需要事物的具体信息。通过分析,我们发现八卦炉生产人类的方法输入参数类型应该是Human接口的实现类,这也解释了为什么类图上的AbstractHumanFactory抽象类中createHuman方法的参数为Class类型。其源代码如代码清单8-5所示。
1700457238
1700457239 代码清单8-5 抽象人类创建工厂
1700457240
1700457241 public abstract class AbstractHumanFactory{
1700457242
1700457243 public abstract<T extends Human>T createHuman(Class<T>c);
1700457244
1700457245 }
1700457246
1700457247 注意,我们在这里采用了泛型(Generic),通过定义泛型对createHuman的输入参数产生两层限制:
1700457248
1700457249 ❑必须是Class类型;
1700457250
1700457251 ❑必须是Human的实现类。
1700457252
1700457253 其中的“?”表示的是,只要实现了Human接口的类都可以作为参数,泛型是JDK 1.5中的一个非常重要的新特性,它减少了对象间的转换,约束其输入参数类型,对Collection集合下的实现类都可以定义泛型。有关泛型的详细知识,请参考相关的Java语法文档。
1700457254
1700457255 目前女娲只有一个八卦炉,其实现生产人类的方法,如代码清单8-6所示。
1700457256
1700457257 代码清单8-6 人类创建工厂
1700457258
1700457259 public class HumanFactory extends AbstractHumanFactory{
1700457260
1700457261 public<T extends Human>T createHuman(Class<T>c){
1700457262
1700457263 //定义一个生产的人种
1700457264
1700457265 Human human=null;
1700457266
1700457267 try{
1700457268
1700457269 //产生一个人种
1700457270
1700457271 human=(Human)Class.forName(c.getName()).newInstance();
[ 上一页 ]  [ :1.700457222e+09 ]  [ 下一页 ]