天天看点

工厂方法模式思考及 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后要写全路径才可。

以上就是关于工厂方法模式及其调试的全部内容啦。

就当做给自己记个笔记哈哈

继续阅读