谁能帮忙看看《thinking in java》第14章的这个简单的注册工厂有啥用?

问题描述

packageChapter14_RTTI;publicinterfaceFactory<T>{Tcreate();}

packageChapter14_RTTI;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;publicclassPart{@OverridepublicStringtoString(){returnthis.getClass().getSimpleName();}staticList<Factory<?extendsPart>>partFactories=newArrayList<Factory<?extendsPart>>();static{partFactories.add(newFuelFilter.Factory());/**继续添加类型,,,省去,*/}privatestaticRandomrandom=newRandom(47);publicstaticPartcreatRandom(){returnpartFactories.get(random.nextInt(partFactories.size())).create();}}classFilterextendsPart{}classFuelFilterextendsFilter{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<FuelFilter>{@OverridepublicFuelFiltercreate(){returnnewFuelFilter();}}}classFuelFilterSextendsFuelFilter{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<FuelFilterS>{@OverridepublicFuelFilterScreate(){returnnewFuelFilterS();}}}classAirFilterextendsFilter{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<AirFilter>{@OverridepublicAirFiltercreate(){returnnewAirFilter();}}}classOilFilterextendsFilter{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<OilFilter>{@OverridepublicOilFiltercreate(){returnnewOilFilter();}}}classBeltextendsPart{}classFanBeltextendsBelt{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<FanBelt>{@OverridepublicFanBeltcreate(){returnnewFanBelt();}}}classGeneratorBeltextendsBelt{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<GeneratorBelt>{@OverridepublicGeneratorBeltcreate(){returnnewGeneratorBelt();}}}classPowerSteeringBeltextendsBelt{publicstaticclassFactoryimplementsChapter14_RTTI.Factory<PowerSteeringBelt>{@OverridepublicPowerSteeringBeltcreate(){returnnewPowerSteeringBelt();}}}

packageChapter14_RTTI;publicclassTest{publicstaticvoidmain(String[]args){for(inti=0;i<10;i++)System.out.println(Part.creatRandom());}}

输出FuelFilterFuelFilterFuelFilterFuelFilterFuelFilterFuelFilterFuelFilterFuelFilterFuelFilterFuelFilter

这个显得有点高深,懂得可以谈谈,其实这个例子是联系上文的,但是凭借我的理解还是不能够,对注册工厂或者是工厂方法或者《thinkinginjava》有一定理解的同学可以谈谈!!!

解决方案

解决方案二:
这是很常见的一种设计模式,如果java语言还不是很好可以先忽略这些。我是菜鸟,我说我的理解。给你举个例子吧,要做一个加减乘除最简单的俩数计算。a+b或者a-b那么可以定义一个接口publicinterfaceOperator(){publicdoublegetResult(doublea,doubleb);}

然后你的加减乘除都实现这个接口,classplusimplementsOperator{doublea;doubleb;plus(doublea,doubleb){this.a=a;this.b=b;}publicdoublegetResult(doublea,doubleb){returna+b;}}

减法,乘法,除法只用写类就行。这样有什么好处呢?就是说,你现在有main函数,写好的,调用接口中的方法,不用考虑具体是哪个类,到时候根据你传入的类名就能得到想要的结果。又有一个原则:扩展开放,修改关闭。所以这么写就能直接增加功能但不修改代码。也就是面向接口的编程模式。具体你用反射加配置文件就能实现外部控制程序执行。减小耦合度,减小依赖程度。所谓轻量级。
解决方案三:
这个例子是把一个比较简单的问题搞复杂了,你可以先抛开泛型,先了解一下什么是工厂模式。理解了工厂模式的工作机制之后,然后再看看泛型相关的,然后再看这个例子。
解决方案四:
在下看thinkinjava的时候java还没有泛型T_T

时间: 2024-10-26 06:15:06

谁能帮忙看看《thinking in java》第14章的这个简单的注册工厂有啥用?的相关文章

数据库-求大神帮忙写一个基于java的学生学籍管理系统

问题描述 求大神帮忙写一个基于java的学生学籍管理系统 具体功能有:1)设计入学.管理及查询界面 2)设计学生各学期.学年成绩输入及查询界 面,并打印各项报表 3)根据各年度总成绩,查询.输出学生学籍管理方案(优秀,合格,试读,退学) 4)毕业管理 5)系统维护,如数据安全管理(含系统备份 与恢复),操作员管理,权限设置 解决方案 这个说起来简单,但是要做的话还是要一点时间的,这应该是一个毕业设计的课题呀 解决方案二: 你确定你不花钱或者撒个娇有人会花时间帮你做这个 解决方案三: 需要定制么?

各位大神帮忙看下一个JAVA多线程问题

问题描述 各位大神帮忙看下一个JAVA多线程问题 public class ttt { public static void main(String args[]) { account a=new account(); person person1=new person(); person person2=new person(); person1.cunkuanjine=1000; person2.cunkuanjine=2000; person1.zhanghu=a; person2.zha

求大牛们帮忙,介绍一下java解析多层xml

问题描述 求大牛们帮忙,介绍一下java解析多层xml 假设xml文档如下 那么该如何解析输出如下 求大牛们能给出java dom解析的代码,特别是判断文本内容的部分,也就是循环到哪里就能输出文本内容 解决方案 <?xml version="1.0" encoding="UTF-8"?> yy00000000000372 zz00000000000152 解决方案二: <?xml version="1.0" encoding=&

对象-求帮忙看一段java代码,很短的

问题描述 求帮忙看一段java代码,很短的 import java.util.*; public class Student implements Comparable { int score=0; String name; Student(int score,String name){ this.name=name; this.score=score; } public int compareTo(Object b){ Student st=(Student)b; return(this.sc

求大神帮忙解决 Android项目java空指针异常问题 真的很急 - -

问题描述 求大神帮忙解决 Android项目java空指针异常问题 真的很急 - - 新手小白参考网上教程学习的socket使用,代码几乎雷同老师写的就可以运行我的就会出问题,connect()方法正确可用,但是send()方法不能用,会提示如图空指针异常,但是我真的找不到是哪里的问题,求大神指点.困扰两天了 茶不思饭不想.(由于提问字数问题导包部分代码没有粘过来) 我用Broadcast在一个activity中监听到操作后广播消息过来然后触发java类里面的方法,触发到connect()就可以

求大神帮忙使用netbeans写java连接数据库时Statemnt中没有executeQuery方法

问题描述 求大神帮忙使用netbeans写java连接数据库时Statemnt中没有executeQuery方法 我在使用的netbeans中做数据库连接的时候没有Statemnt中没有executeQuery方法但是有execute方法怎么办是JDK的问题还是netbeans问题?求大神帮助!!!! 解决方案 public interface Statement 中有executeQuery 在java.sql中; public class Statement 这里面是没有executeQue

帮忙看一下,java连接数据的问题!!求大神帮忙

问题描述 帮忙看一下,java连接数据的问题!!求大神帮忙 解决方案 解决方案二: 解决方案三: 求大神帮忙啊!!!!!!!!!!!!!!!!!!! 解决方案四: 看你的jar包,你的sqlserver应该是2008版本,换个jar包,sqljdbc4 解决方案五: 应该是版本不对,或者driverStr写错了 解决方案六: buildpath里看下jar包添加了没有.如果添加了可以试一下把项目重新编译一下,再不行可能是版本不对,换个驱动包 解决方案七: 驱动类找不到,检查下你的驱动jar包有没

jboss-SOS请大家帮帮忙~愁死了java

问题描述 SOS请大家帮帮忙~愁死了java 问题是这样的,jsp页面统一采用的是GBK的编码格式.web服务器使用的是JBOSS. 在如下查询页面中输入中文的查询条件: 在点击下一页的时候,要求查询条件也进行回显.但是会出现下面这样的乱码问题. 麻烦大神帮我看看···· 解决方案 数据库里的数据正常吗 ? 解决方案二: 应该是你的web服务起做了编码UTF-8了 后台传回来的中文是UTF-8格式 但是前台显示的是GBK 这个就会造成乱码 解决方案三: 先右键项目的properties,点res

java-求高手帮忙看看这段Java代码有什么错误。

问题描述 求高手帮忙看看这段Java代码有什么错误. package com.nightworld.why; import java.io.File; import java.util.List; import java.util.Timer; import java.util.TimerTask; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit