今天实验课上写了工厂方法模式的相关
题目:
海尔工厂(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后要写全路径才可。
以上就是关于工厂方法模式及其调试的全部内容啦。
就当做给自己记个笔记哈哈