工厂模式
有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用Java控制台应用程序实现该OEM制造商的工厂模式。绘制该模式的UML图。可更改的部分要求用XML配置文件实现。
(此图引用自qq_35853)
注意此UML与下面代码不对应,贴出来是为了更容易理解
package laptop;
//电脑品牌类型
public interface Laptop {
public void laptopType();
}
package laptop;
//Acer
public class Acer implements Laptop {
@Override
public void laptopType() {
System.out.println("Acer");
}
}
package laptop;
//Dell
public class Dell implements Laptop{
@Override
public void laptopType() {
System.out.println("Dell");
}
}
package laptop;
//Lenovo
public class Lenovo implements Laptop{
@Override
public void laptopType() {
System.out.println("Lenovo");
}
}
package laptop;
//电脑品牌类型工厂实体类
public interface LaptopFactory {
Laptop getLaptopType();
}
class AcerFactory implements LaptopFactory{
@Override
public Laptop getLaptopType() {
return (Acer)BeanFactory.getBean("AcerDao");
}
}
class LenovoFactory implements LaptopFactory{
@Override
public Laptop getLaptopType() {
return (Lenovo)BeanFactory.getBean("LenovoDao");
}
}
class DellFactory implements LaptopFactory{
@Override
public Laptop getLaptopType() {
return (Dell)BeanFactory.getBean("DellDao");
}
}
package laptop;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class BeanFactory {
public static Object getBean(String id) {
try {
// 创建SAXReader对象来读取配置文件
SAXReader reader = new SAXReader();
// 读取配置文件的内容,获得Document对象
Document document = reader
.read(BeanFactory.class.getClassLoader().getResourceAsStream("factory.xml"));
// 利用XPath来读取到class元素
Element beanElement = (Element) document.selectSingleNode("//bean[@id='" + id + "']");
// 获取到class后的路径
String value = beanElement.attributeValue("class");
System.out.println(value);
// 利用反射获得实现类对象
Class clazz = Class.forName(value);
return clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
factory.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="AcerDao" class="laptop.Acer"></bean>
<bean id="LenovoDao" class="laptop.Lenovo"></bean>
<bean id="DellDao" class="laptop.Dell"></bean>
</beans>
test类
package laptop;
public class Test {
public static void main(String[] args) {
// Laptop acer,lenovo,dell;
LaptopFactory af = new AcerFactory();
LaptopFactory lf = new LenovoFactory();
LaptopFactory df = new DellFactory();
af.getLaptopType().laptopType();
lf.getLaptopType().laptopType();
df.getLaptopType().laptopType();
}
}