天天看點

工廠方法模式思考及 Class.forName報錯調試

今天實驗課上寫了工廠方法模式的相關

題目:

海爾工廠(Haier)生産海爾空調(HaierAirCondition),美的工廠(Midea)生産美的空調(MideaAirCondition) 。使用工廠方法模式描述該場景,繪制類圖并程式設計實作。

類圖 

工廠方法模式思考及 Class.forName報錯調試

執行個體代碼和解釋

抽象産品類空調類:

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());
		}
	}

}
           

到此我們已經寫完所有代碼了。運作一下。

工廠方法模式思考及 Class.forName報錯調試

在控台報出了這樣的錯。經過排查,發現是XMLUtil類中的代碼出錯了。 

錯誤代碼:

Class c =Class.forName(cName);
           

經過查閱資料,發現是因為路徑沒有寫全= =

修改後的代碼:

Class c =Class.forName("com.factorymethod."+cName);
           

“com.factorymethod”是包名。

修改以後再運作一次

工廠方法模式思考及 Class.forName報錯調試

完美運作~

再貼一下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後要寫全路徑才可。

以上就是關于工廠方法模式及其調試的全部内容啦。

就當做給自己記個筆記哈哈

繼續閱讀