题目:
题目要求:
1.代码:
BenzFactory类:抽象的工厂接口
package factory;
public interface BenzFactory { 抽象的工厂 -->生产产品
public abstract Benz createCar();
}
E260Factory类:具体的工厂类
package factory;
public class E260Factory implements BenzFactory {
@Override
public Benz createCar() {
// TODO Auto-generated method stub
return new BenzE260();
}
}
C180Factory类:具体的工厂类
package factory;
public class C180Factory implements BenzFactory {
@Override
public Benz createCar() {
// TODO Auto-generated method stub
return new BenzC180();
}
}
Benz类:抽象的产品接口
package factory;
public interface Benz {
public abstract void carColor();//车辆颜色
public abstract void carSpeed();//车辆速度
public abstract void carPrice();//车辆价格
}
BenzC180类:具体的产品类
package factory;
public class BenzC180 implements Benz {
//重写
@Override
public void carColor() {
// TODO Auto-generated method stub
System.out.println("BenzC180 carColor :red");
}
@Override
public void carSpeed() {
// TODO Auto-generated method stub
System.out.println("BenzC180 carSpeed :180");
}
@Override
public void carPrice() {
// TODO Auto-generated method stub
System.out.println("BenzC180 carPrice :40w");
}
}
BenzE260类:具体的产品类
package factory;
public class BenzE260 implements Benz {
@Override
public void carColor() {
// TODO Auto-generated method stub
System.out.println("BenzE260 carColor :black");
}
@Override
public void carSpeed() {
// TODO Auto-generated method stub
System.out.println("BenzE260 carSpeed :160");
}
@Override
public void carPrice() {
// TODO Auto-generated method stub
System.out.println("BenzE260 carPrice :30w");
}
}
测试结果见第3问
- 创建XMl文件 config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>C180Factory</className>
</config>
ConfigTest类:
package factory;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import javax.xml.parsers.*;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ConfigTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//调用 DocumentBuilderFactory.newInstance()
方法得到创建 DOM 解析器的工厂
DocumentBuilderFactory docfactory = DocumentBuilderFactory.newInstance();
//调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象
DocumentBuilder docbuilder = docfactory.newDocumentBuilder();
//调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文 档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了; 把要解析的 XML 文档转化为输入流,
//以便 DOM 解析器解析它
Document doc = docbuilder.parse(new File("config.xml"));
//得到 XML 文档的className
NodeList nlist = doc.getElementsByTagName("className");
//得到节点的子节点
Node node = nlist.item(0).getFirstChild();
//输出
String cname = node.getNodeValue();
System.out.println("node value: " + cname);
//第三步 使用Java反射机制 将类返回
//3.1 通过获取到的类名创建对象类
Class c = Class.forName(cname);
//3.2 使用newInstance生成新的对象
Benz benzcar = null;
@SuppressWarnings("unchecked")
Object obj = c.getDeclaredConstructor().newInstance();
benzcar = ((C180Factory)obj).createCar();
benzcar.carColor();
benzcar.carPrice();
benzcar.carSpeed();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
将config.xml移到C:\Users\15597\eclipse-workspace\factory目录下,与src同级目录
运行结果:
node value: C180Factory
BenzC180 carColor :red
BenzC180 carPrice :40w
BenzC180 carSpeed :180
参考:DocumentBuilderFactory解析XML
DocumentBuilderFactory解析XML_懒惰的小肥肥的博客-优快云博客_documentbuilderfactory
在实现第三步反射时:需将config.xml文件中的C180Factory改为factory.C180Factory
即:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>factory.C180Factory</className>
</config>
原因:全限定类名:就是类名全称,带包路径的用点隔开
//第三步 使用Java反射机制 将类返回
//3.1 通过获取到的类名创建对象类
Class c = Class.forName(cname);
//3.2 使用newInstance生成新的对象
Benz benzcar = null;
@SuppressWarnings("unchecked")
Object obj = c.getDeclaredConstructor().newInstance();
benzcar = ((C180Factory)obj).createCar();
benzcar.carColor();
benzcar.carPrice();
benzcar.carSpeed();
3.TestFactory 测试类:
package factory;
public class TestFactory {
public static void main(String[] args) {
// TODO Auto-generated method stub
BenzFactory factory = null;// 抽象的工厂
Benz benzcar = null; // 抽象的实例
factory = new C180Factory();
benzcar = factory.createCar();
benzcar.carColor();
benzcar.carPrice();
benzcar.carSpeed();
System.out.println("--------------");
factory = new E260Factory();
benzcar = factory.createCar();
benzcar.carColor();
benzcar.carPrice();
benzcar.carSpeed();
}
}
运行结果:
BenzC180 carColor :red
BenzC180 carPrice :40w
BenzC180 carSpeed :180
--------------
BenzE260 carColor :black
BenzE260 carPrice :30w
BenzE260 carSpeed :160