RSS
热门关键字:  数据挖掘  数据仓库  商业智能  人工智能  搜索引擎

工厂类问题,J2EE初学者提问

来源: 作者: 时间:2008-01-04 点击:

我想问一下。关于DOM   标准来实现xml的得到数据的时候,关于以下代码:
/1/DocumentBuilderFactory   domfactory   =   DocumentBuilderFactory.newInstance();
/2/domFactory.setValidating(false);domfactory.setNamespaceAware(true);
/3/DocumentBuilder   domBuilder   =domfactory.newDocumentBuilder();
/4/Document   document   =domBuilder.parse(new   File("1.xml"));


首先我想问一下,第一条代码,是实例化一个DocumentBuilderFactory对象,为什么不这样写呢:DocumentBuilderFactory   domfactory   =new   DocumentBuilderFactory();所以工厂类到底有什么用,

同样的,实例化一个DocumentBuilder   对象,为什么要写成代码3那样,不直接用new   呢?

第4行代码也是如此,。希望高手详细的讲解一下

1   创建单例。
2   设置一些参数,过滤器。验证DTD什么的。
3   建立一个DocumentBuilder类对象。
4   同上。
http://blog.csdn.net/zhou2002/archive/2007/11/29/1907783.aspx

还是不清楚,能详细点吗,你讲的好象没讲一样,呵呵

singleton

DocumentBuilderFactory   这是一个抽象的类,所以不能直接实例...但是这个用newInstance实例了之后一个DocumentBuilderFactory对象..


DocumentBuilderFactory     dbf   =DocumentBuilderFactory.newInstance();,,,
但是用DocumentBuilder   db=dbf.newDocumentBuilder();这里是实例一个对象,是dom解析器对象(书上这样说).但是上面的实例(dbf   )起的是一个什么作用呢???/急需求解

简单点说,就是把对象的创建和使用分离开了。

你在所有的代码中都可以用同样的方式得到DocumentBuilder。你不需要知道怎么创建DocumentBuilder对象,比如用什么实现类,用什么初始化参数。这些都在另外的配置文件中,这样如果要实现全局的DOM解析器的替换,就不需要改动所有引用到的地方。

其实DocumentBuilder也是一个抽象类来的,是不能直接实例化的,而语句dbf.newDocumentBuilder()就创建了一个实例化的类了。
举个例子:
水果工厂   fruitFactory   =     水果工厂.实例化();   //创建一个实例化的水工工厂
水果   fruit   =   水果工厂.创建一个水果();
如果,调用“水果工厂.创建一个水果()”后,产生的可能是葡萄、也可能是西瓜,看这个方法里面是怎么写的,而西瓜是一个实体的东西,而水果只是一个抽象的东西

虽然我没完全看懂你所表达的意思...



就工厂类这个问题,以下是我的看法...

我所常用的   建一个静态工厂类.一个业务层接口,一个业务层具体实现方法类.

当前台需要某种方法时,则是先向工厂发出一项请求,由业务接口去安排指定的实体业务去产生指定的方法.

其操作流程可以打这么一个比方.

比如我这里开的是一家某种产品的专卖店.
专卖店的店主需要进货时.   会联系厂家的销售部门,销售部门接到订单后,会向其加工部门反应,加工部门去进行相关的操作.加工出产品...

这样的好处是,店主不需要厂家如何生产这种商品,而厂家也不需要知道店家去如何销售...销售部门则起到了一个中转的过渡环节...

再回到程序里来...

比如在J2EE中,控制层需要一个方法时...   他会向工厂发出请求...   工厂类去实例化一个业务接口对应的业务实体类.     (达到MVC的作用.)
其好处就在于,发但软件被反编译时,最多只能看到接口层,再也无法看到下面的实体业务...

这里接口的作用是:   只说不做.
实体业务层:它即说又要去做.
控制层不管你们去怎么做.它只要得它想要的方法...


MVC+DAO   设计模式就是这样的原理....

数据挖掘研究院



这是我所理解的,如果理解有误,请不要见笑....

对了我再补充一下它们之间的关系....
刚刚好像说的不是很完整   ...
再打个比方...


工厂类           只需要去安排谁做.   (我不管你怎么做,任务来了,我让你做,你就得给我做.   PS:领导级的人物!)
实体接口       只说不做.                 (你们给我去做XXX任务,领导发话,你们不做,领导会很生气,后果会很严重!     PS:科长,班长,一类的人物)
实体业务       即要说又要做.           (头发话,大家干活啊...     PS:   底线工人类,叫干啥就得干啥...)

谢谢你们的回答,但是在java   的DocumentBuilderFactory   这个抽象类里面的   newDucomentFactorty   是个抽象的,并没..
那么,我们用DocumentBuilder       db=dbf.newDocumentBuilder();这样来调用,为什么会返回一个值呢??(dbf是DocumengBuilderFactory的实例).


DocumentBuilderFactory   中   newDucomentFactorty   的代码是



        public   abstract   DocumentBuilder   newDocumentBuilder()
                throws   ParserConfigurationException;
       

大家可以看java的src.rar里面的有

我同意7楼的说法,实际就是这样
一般就是:工厂   ,DAO接口   ,DAO的实现类
这样提高了代码的利用率,如果有变动,只需要对DAO实现类中的具体方法进行修改.
工厂和DAO接口中都是抽象方法,只有DAO实现类中才有具体的方法

如果只是说工厂类的话,它的出现最初是解决一个类的实例化太复杂的问题.

比如说我现在要实例化一个楼主

Java code
楼主 本贴楼主 = new 楼主(xgj1988,Love J2ee,当前不在线,一个小三角);


甚至情况更复杂,比如实例化楼主的时候要做许多处理,或者这个实例有特殊要求

比如:
楼主的当前状态经常变化或者从其他地方读取,没有被放在代码段中,而是放在其他地方,需要在实例化的过程中读取进来

虽然可以  
楼主   本贴楼主   =   new   楼主();
Java code
public class 楼主 { public 楼主() { 读取配置文件 当前楼主.xml } }
数据挖掘研究院


然后有一个XML文件   当前楼主.xml
XML code
<楼主> <ID>xgj1988</ID> <昵称>Love J2ee</昵称> <状态>不在线</状态> <专家等级>一个三角</专家等级> </楼主>

那么楼主类的构造方法恐怕会比这个类中的其他方法还庞大...

这时候工厂类就可以代替new来实例化楼主

楼主   当前楼主   =   楼主工厂.生产当前楼主();
Java code
public class 楼主 { 楼主(){} } class 楼主工厂 { public static 楼主 生产当前楼主() { 楼主 当前楼主 = new 楼主(); 当前楼主 = {进行相关处理}; return 当前楼主; } }
数据挖掘研究院


这么做的好处,至少调用"楼主工厂.生产当前楼主()"的时候,不用再关心当前楼主是打哪儿来的,怎么来的,可以专心的处理楼主

而且也能方便的实现   "楼主工厂-> 楼主接口-> 当前楼主"   的思想,代码美观而可读性高,弱耦合,等等优点.....

另外,上面随便举的例子,楼主别太介意....而且匆忙之间可能有错,只是表达这个意思而已

嗯,不错,谢了

这个楼主工厂的例子太强大了...   我汗~~~

Create By Any-Extract(WL-AE)

数据挖掘研究院

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?