设计模式-抽象工厂模式实例-02
一、实验目的和要求:
1. 抽象工厂模式的运用
(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) {
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());
}
}
}
实验结果:
四、心得体会
出现的问题:抽象工厂类应该是一个接口类,创建的时候粗心创建成了普通类,导致具体接口类无法实现抽象接口类。
解决方法:通过仔细对比之前刚学完时所写的代码,顺利发现问题并改正。
体会:写代码不能图快,要经过仔细审题,画类图,建结构,仔细看好项目的结构和细节之后再动笔。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性