1:看解释器模式,看到下面的代码
Document doc = null;
//建立一个解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//得到一个表示XML文档的Document对象
doc=builder.parse(filePathName);
//去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象
doc.normalize();
DocumentBuilderFactory为抽象类,抽象类一般是不会去实例化的。
这里的DocumentBuilderFactory.newInstance()是使用了抽象类的static方法去返回一个实例,
可以看源码
public static DocumentBuilderFactory newInstance() {
try {
return (DocumentBuilderFactory) FactoryFinder.find(
/* The default property name according to the JAXP spec */
"javax.xml.parsers.DocumentBuilderFactory",
/* The fallback implementation class name */
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
} catch (FactoryFinder.ConfigurationError e) {
throw new FactoryConfigurationError(e.getException(),
e.getMessage());
}
}
这里返回的是FactoryFinder.find,find方法去查找本地的实例类,我们可以通过代码去看下
public class test{
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
System.out.println(factory);
System.out.println(builder);
System.out.println(document);
}
}
输出结果为
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl@15eb0a9
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl@1a05308
[#document: null]
而DocumentBuilderFactoryImpl则是
public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory{}
DocumentBuilderImpl则是
public class DocumentBuilderImpl extends DocumentBuilder implements JAXPConstants{}
都是实例化的子类。
2:其实抽象类的newInstance方法一般都定义为static的,使用静态方法返回其子类实例的类。这样做一般就是表明它的子类不应该再扩展其他新的方法了,只需要实现这个抽象类声明的方法就够了。比如内部类
public abstract class Abstract {
public static Abstract newInstance() {
return new AbstractImpl();
}
public abstract void method(String s);
protected static class AbstractImpl extends Abstract {
public void method(String s) {
System.out.println(s);
}
}
public static void main(String [] args){
Abstract abs=Abstract.newInstance();
System.out.println(abs);
abs.method("抽象类的newInstance演示");
}
}
运行结果为
com.lxw.test.Abstract$AbstractImpl@757aef
抽象类的newInstance演示