一、案例背景
计算机包含内存(RAM),CPU 等硬件设备,根据如图所示的“产品等级结构-产品族示意图”,使用抽象工厂模式实现计算机设备创建过程并绘制类图
二、实现步骤
- 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类 AbstractFactory,PcFactory 和 MacFactory 两个具体工厂,CPU,RAM 两个抽象产品类,PcCPU,MacCPU,PcRAM,MacRAM 四个具体产品类。## 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类 AbstractFactory,PcFactory 和 MacFactory 两个具体工厂,CPU,RAM 两个抽象产品类,PcCPU,MacCPU,PcRAM,MacRAM 四个具体产品类。
- 根据类图,实现上述类的具体代码以及用户类 Client 和辅助类 XMLUtil 以实现通过 XML 文件来制造不同的产品
- 更改 XML 中的属性,观察用户类是否能使用不同的产品
三、实验结果
- 项目UML类图,如下:
2. 项目结构:
3. 详细代码:
抽象工厂类
public abstract class AbstractFactory {
public abstract Cpu createCpu();
public abstract Ram createRam();
}
抽象产品类
CPU类:
public abstract class Cpu {
public void playCpu(){
System.out.println("CPU!!!");
}
}
RAM类:
public abstract class Ram {
public void playRam(){
System.out.println("RAM!!!");
}
}
具体工厂类
PcFactory类:
public class PcFactory extends AbstractFactory {
@Override
public Cpu createCpu() {
System.out.println("2020006924使用Pc工厂生产CPU");
return new PcCpu();
}
@Override
public Ram createRam() {
System.out.println("2020006924使用Pc工厂生产RAM");
return new PcRam();
}
MacFactory
public class MacFactory extends AbstractFactory {
@Override
public Cpu createCpu() {
System.out.println("2020006924在使用MacFactory生产CPU");
return new MacCpu();
}
@Override
public Ram createRam() {
System.out.println("2020006924在使用MacFactory生产RAM");
return new MacRam();
}
}
具体产品类
PcCpu类,如下:
public class PcCpu extends Cpu {
@Override
public void playCpu() {
System.out.println("!!PcCPU!!");
}
}
PcRam类,如下:
public class PcRam extends Ram {
@Override
public void playRam() {
System.out.println("!!PcRAM!!");
}
}
MacCpu类,如下:
public class MacCpu extends Cpu {
@Override
public void playCpu() {
System.out.println("!!!MacCPU!!!");
}
}
MacRam类,如下:
public class MacRam extends Ram {
@Override
public void playRam() {
System.out.println("!!!MacRAM!!!");
}
}
配置文件config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<className>PcFactory</className>
</config>
XMLUtil类
public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
public static Object getBean()
{
try
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("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;
}
}
}
客户类
public class Client {
public static void main(String[] args) {
try{
AbstractFactory factory = (AbstractFactory) XMLUtil.getBean();
Cpu cpu = factory.createCpu();
Ram ram = factory.createRam();
cpu.playCpu();
ram.playRam();
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
- 运行结果
案例总结
抽象工厂模式主要适用于:
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节
- 系统中有多于一个的产品族,但每次只使用其中某一产品族
- 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来
- 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构