Factory模式
利用給Factory對象傳遞不同的參數,以返回具有相同基類或實現了同一接口的對象。
Abstract Factory模式
先利用Factory模式返回Factory對象,在通過Factory對象返回不同的對象!
Java中的例子-----JAXP1.0.1 :
以下是用Simple API for XML(SAX) Parse XML文件的片段
...
String uri = "file:" + new File (xmlfilename).getAbsolutePath ();
Parser parser;
//1. Abstract Factory模式
SAXParserFactory spf = SAXParserFactory.newInstance ();
String validation = System.getProperty (
"javax.xml.parsers.validation", "false");
if (validation.equalsIgnoreCase("true"))
spf.setValidating (true);
//2. Factory模式
SAXParser sp = spf.newSAXParser ();
parser = sp.getParser ();
parser.setDocumentHandler (this);
parser.parse (uri); 網管下載dl.bitscn.com
....
1. SAXParserFactory中的靜態方法newInstance()根據系統屬性javax.xml.parsers.SAXParserFactory不同的值
生成不同的SAXParserFactory對象spf。然後SAXParserFactory對象又利用方法newSAXParser()生成SAXParser對象。
注意:
SAXParserFactory 的定義爲:
public abstract class SAXParserFactory extends java.lang.Object
SAXParserFactoryImpl 的定義爲:
public class SAXParserFactoryImpl extends javax.xml.parsers.SAXParserFactory
public static SAXParserFactory newInstance() {
String factoryImplName = null;
try {
factoryImplName =
System.getProperty("javax.xml.parsers.SAXParserFactory",
"com.sun.xml.parser.SAXParserFactoryImpl");
}catch (SecurityException se) {
factoryImplName = "com.sun.xml.parser.SAXParserFactoryImpl";
}
SAXParserFactory factoryImpl;
中國網管論壇bbs.bitsCN.com
try {
Class clazz = Class.forName(factoryImplName);
factoryImpl = (SAXParserFactory)clazz.newInstance();
}catch (ClassNotFoundException cnfe) {
throw new FactoryConfigurationError(cnfe);
} catch (IllegalAccessException iae) {
throw new FactoryConfigurationError(iae);
} catch (InstantiationException ie) {
throw new FactoryConfigurationError(ie);
}
return factoryImpl;
}
2. newSAXParser()方法在SAXParserFactory定義爲抽象方法,
SAXParserFactoryImpl繼承了SAXParserFactory,它實現了方法newSAXParser():
public SAXParser newSAXParser() throws SAXException,
ParserConfigurationException
{
SAXParserImpl saxParserImpl = new SAXParserImpl (this);
return saxParserImpl;
}
注意: 網管下載dl.bitscn.com
SAXParserImpl的定義爲:
public class SAXParserImpl extends javax.xml.parsers.SAXParser
SAXParserImpl的構造函數定義爲:
SAXParserImpl (SAXParserFactory spf) throws SAXException,
ParserConfigurationException
{
super();
this.spf = spf;
if (spf.isValidating ()) {
parser = new ValidatingParser();
validating = true;
}
else {
parser = new Parser();
}
if (spf.isNamespaceAware ()) {
namespaceAware = true;
throw new ParserConfigurationException
("Namespace not supported by SAXParser");
}
}
本例子中用到的class和interface的類關係圖如下
【轉自www.bitsCN.com】