看例子
1.TV產品接口,負責播放
public interface TV // TV接口
{
public void play();
}
2.TV工廠接口,負責生產產品
public interface TVFactory // TV接口工廠
{
public TV produceTV();
}
3.TV具體產品類,海爾,海信
public class HaierTV implements TV
{
public void play()
{
System.out.println("海爾電視機播放中......");
}
}
public class HisenseTV implements TV
{
public void play()
{
System.out.println("海信電視機播放中......");
}
}
4.TV具體工廠類
public class HaierTVFactory implements TVFactory
{
public TV produceTV()
{
System.out.println("海爾電視機工廠生產海爾電視機。");
return new HaierTV();
}
}
public class HisenseTVFactory implements TVFactory
{
public TV produceTV()
{
System.out.println("海信電視機工廠生產海信電視機。");
return new HisenseTV();
}
}
5.配置config.xml
<?xml version="1.0"?>
<config>
<className>HisenseTVFactory</className>
</config>
6.讀取配置文件類
import javax.xml.parsers.*; // 引入xml
import org.w3c.dom.*; // 引入dom支持
import org.xml.sax.SAXException;
import java.io.*; // 引入io支持
public class XMLUtil {
//該方法用於從XML配置文件中提取具體類類名,並返回一個實例對象
public static Object getBean() {
try {
//創建文檔對象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("./src/config.xml"));
//獲取包含類名的文本節點
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//通過類名生成實例對象並將其返回
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
6.客戶端
public class Client
{
public static void main(String args[])
{
try
{
TV tv; // 定義tv對象
TVFactory factory; // 定義工廠
factory=(TVFactory)XMLUtil.getBean(); // 強制轉化,魔術處理
tv=factory.produceTV(); // 創建電視對象
tv.play(); // 播放電視
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
目錄結構如下