今天實驗課上寫了工廠方法模式的相關
題目:
海爾工廠(Haier)生産海爾空調(HaierAirCondition),美的工廠(Midea)生産美的空調(MideaAirCondition) 。使用工廠方法模式描述該場景,繪制類圖并程式設計實作。
類圖
執行個體代碼和解釋
抽象産品類空調類:
public interface AirCondition {
public void run();
}
AirCondition作為抽象産品類,它可以是一個借口,也可以是一個抽象類。其中包含了所有産品都具有的業務方法run()。
具體産品類HaierAirCondition
public class HairAirCondition implements AirCondition {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("海爾空調正在運作中");
}
}
HaierAirCondition是抽象産品AirCondition接口的子類,實作了在AirCondition接口中定義的業務方法run()。
具體産品類MideaAirCondition類
public class MideaAirCondition implements AirCondition {
@Override
public void run() {
System.out.println("美的空調正在運作中");
}
}
抽象工廠類ACFactory
public interface ACFactory {
public AirCondition produceAirCondition();
}
ACFactory是抽象工廠類,它可以是一個借口,也可以是一個抽象類,她包含了抽象工廠方法produceAirCondition(),傳回一個抽象産品AirCondition類型的對象。
具體工廠類HairACFactory
public class HairACFactory implements ACFactory {
@Override
public AirCondition produceAirCondition() {
System.out.println("生産海爾空調");
return new HairAirCondition();
}
}
具體工廠類,是抽象工廠類ACFactory的子類,實作了抽象工廠方法produceAirCondition(),在工廠方法中建立并傳回一個對象的具體産品。
具體工廠類MideaACFactory
public class MideaACFactory implements ACFactory {
@Override
public AirCondition produceAirCondition() {
System.out.println("美的空調工廠生産美的空調");
return new MideaAirCondition();
}
}
輔助代碼
XML操作工具類XMLUtil
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
/**
* 從xml配置檔案裡提取具體類類名,并傳回一個執行個體對象
* @return
*/
public class XMLUtil {
public static Object getBean() {
try {
//建立dom文檔對象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("configAirCondition.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) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("xmlutil錯了");
return null;
}
}
}
配置檔案configAirCondition.xml
<config>
<className>HairACFactory</className>
</config>
用戶端測試類Client
package com.factorymethod;
public class Client {
public static void main(String[] args) {
try
{
AirCondition airCondition;
ACFactory factory;
factory =(ACFactory)XMLUtil.getBean();
airCondition =factory.produceAirCondition();
airCondition.run();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
到此我們已經寫完所有代碼了。運作一下。
在控台報出了這樣的錯。經過排查,發現是XMLUtil類中的代碼出錯了。
錯誤代碼:
Class c =Class.forName(cName);
經過查閱資料,發現是因為路徑沒有寫全= =
修改後的代碼:
Class c =Class.forName("com.factorymethod."+cName);
“com.factorymethod”是包名。
修改以後再運作一次
完美運作~
再貼一下XMLUtil檔案修改後的全代碼:
package com.factorymethod;
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
/**
* 從xml配置檔案裡提取具體類類名,并傳回一個執行個體對象
* @return
*/
public class XMLUtil {
public static Object getBean() {
try {
//建立dom文檔對象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("configAirCondition.xml"));
//擷取包含類名的文本節點
NodeList nl = doc.getElementsByTagName("className");
Node classNode =nl.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//通過類名生成執行個體對象并将其傳回
Class c =Class.forName("com.factorymethod."+cName);//!!!注意這裡要用全路徑,不然會找不到類!!!
Object obj =c.newInstance();
return obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("xmlutil錯了");
return null;
}
}
}
一定要注意Class.forName後要寫全路徑才可。
以上就是關于工廠方法模式及其調試的全部内容啦。
就當做給自己記個筆記哈哈