本实例的结构图如下:
我们一般开发遵循面向对象的五大基本原则(新手可以自行百度),其中一项为开闭原则,既增加功能的时候
尽量不要改变原来程序的代码,这点容易实现,使用配置文件进行读取无疑是较优的方式,然后通过反射技术
进行类的实例化。
代码架构如下:
代码如下:
<?xml version="1.0"?>
<config>
<className>com.company.BenzFactory</className>
</config>
package com.company;
/**
* Created by Dqd on 2017/4/15.
*/
public interface CarFactory {
Car productCar();
}
public class BMWFactory implements CarFactory{
@Override
public Car productCar() {
return new BMW();
}
}
public class BenzFactory implements CarFactory{
@Override
public Car productCar() {
return new Benz();
}
}
public interface Car {
void run();
}
public class Benz implements Car {
@Override
public void run() {
System.out.println("Benz 开车了");
}
}
public class BMW implements Car {
@Override
public void run() {
System.out.println("BMW 开车了");
}
}
/**
* Created by Dqd on 2017/4/15.
*/
public class GetCar {
static CarFactory carFactory;
static Car car;
public static void main(String[] args){
carFactory = (CarFactory) XMLUtil.getBean();
car = (Car) carFactory.productCar();
car.run();
}
}
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
/**
* Created by Dqd on 2017/4/15.
*/
public class XMLUtil {
public static Object getBean(){
try {
DocumentBuilderFactory documentBuilderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder =
documentBuilderFactory.newDocumentBuilder();
Document document;
document = documentBuilder.parse(new File("source/car.xml"));
//获取类名的文本节点
NodeList nodeList = document.getElementsByTagName("className");
Node node = nodeList.item(0).getFirstChild();
String strname = node.getNodeValue();
Class c = Class.forName(strname);
Object object = c.newInstance();
return object;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
参考:http://blog.csdn.net/lovelion/article/details/7430414