/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还是不清楚,能详细点吗,你讲的好象没讲一样,呵呵singletonDocumentBuilderFactory 这是一个抽象的类,所以不能直接实例...但是这个用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 当前楼主; } }数据挖掘研究院
这么做的好处,至少调用"楼主工厂.生产当前楼主()"的时候,不用再关心当前楼主是打哪儿来的,怎么来的,可以专心的处理楼主
而且也能方便的实现 "楼主工厂-> 楼主接口-> 当前楼主" 的思想,代码美观而可读性高,弱耦合,等等优点.....另外,上面随便举的例子,楼主别太介意....而且匆忙之间可能有错,只是表达这个意思而已嗯,不错,谢了这个楼主工厂的例子太强大了... 我汗~~~

