设计模式-抽象工厂模式实例(二)
(1)案例背景:
计算机包含内存(RAM),CPU等硬件设备
,根据如图所示的“产品等级结构-产品族示意图”,使用抽象工厂模式实现计算机设备创建过程并绘制类图(课本105页第二题)
(2)实现步骤:
- 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类AbstractFactory, PcFactory和MacFactory 两个具体工厂,CPU,RAM两个抽象产品类,PcCPU,MacCPU,PcRAM,MacRAM四个具体产品类。
- 根据类图,实现上述类的具体代码以及用户类Client和辅助类XMLUtil以实现通过XML文件来制造不同的产品
- 更改XML中的属性,观察用户类是否能使用不同的产品
(3)案例总结:
抽象工厂模式主要适用于:
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节
- 系统中有多于一个的产品族,但每次只使用其中某一产品族
- 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来
- 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构
二、实验平台:
JDK 1.8.0;
IDEA 2020.01
三、主要实验内容及结果:
代码结构:
详细代码:
AbstractFactory.java:
import abstractFactory.abstractProduct.CPU; import abstractFactory.abstractProduct.RAM; public interface AbstractFactory { public CPU productCPU(); public RAM productRAM(); }
MacFactory.java:
import abstractFactory.abstractFactory.AbstractFactory; import abstractFactory.abstractProduct.CPU; import abstractFactory.abstractProduct.RAM; import abstractFactory.concreteProduct.MacCPU; import abstractFactory.concreteProduct.MacRAM; public class MacFactory implements AbstractFactory { public CPU productCPU(){ return new MacCPU(); } public RAM productRAM(){ return new MacRAM(); } }
PcFactory.java:
import abstractFactory.abstractFactory.AbstractFactory; import abstractFactory.abstractProduct.CPU; import abstractFactory.abstractProduct.RAM; import abstractFactory.concreteProduct.PcCPU; import abstractFactory.concreteProduct.PcRAM; public class PcFactory implements AbstractFactory { public CPU productCPU(){ return new PcCPU(); } public RAM productRAM(){ return new PcRAM(); } }
CPU.java:
public interface CPU { public void product(); }
RAM.java:
public interface RAM { public void product(); }
MacCPU
import abstractFactory.abstractProduct.CPU; public class MacCPU implements CPU { public void product(){ System.out.println("MacCPU is producting...."); } }
MacRAM
import abstractFactory.abstractProduct.RAM; public class MacRAM implements RAM { public void product(){ System.out.println("MacRAM is producting..."); } }
PcCPU
import abstractFactory.abstractProduct.CPU; public class PcCPU implements CPU { public void product(){ System.out.println("PcCPU is producting..."); } }
PcRAM
import abstractFactory.abstractProduct.RAM; public class PcRAM implements RAM { public void product(){ System.out.println("PcRAM is producting..."); } }
XMLUtil
import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { public static Object getBean(){ try { //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/abstractFactory/utils/config.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){ e.printStackTrace(); return null; } } }
config.xml:
<?xml version="1.0" ?> <config> <className>abstractFactory.concreteFactory.MacFactory</className> </config>
Client
package abstractFactory.Client; import abstractFactory.abstractFactory.AbstractFactory; import abstractFactory.abstractProduct.CPU; import abstractFactory.abstractProduct.RAM; import abstractFactory.utils.XMLUtil; public class Client { public static void main(String[] args) { System.out.println("详细设计实验报告 1904班白旭君 2019005368"); try { AbstractFactory factory; CPU cpu; RAM ram; factory = (AbstractFactory) XMLUtil.getBean(); cpu = factory.productCPU(); ram = factory.productRAM(); cpu.product(); ram.product(); }catch (Exception e){ System.out.println(e.getMessage()); } } }
实验结果: