设计模式之----工厂模式

工厂模式

有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用Java控制台应用程序实现该OEM制造商的工厂模式。绘制该模式的UML图。可更改的部分要求用XML配置文件实现。
(此图引用自qq_35853
注意此UML与下面代码不对应,贴出来是为了更容易理解
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();
		
	}
}

运行结果

猜你喜欢

转载自blog.csdn.net/Felix_ar/article/details/83618357