一、案例背景 電腦包含記憶體(RAM),CPU 等硬體設備,根據如圖所示的“產品等級結構-產品族示意圖”,使用抽象工廠模式實現電腦設備創建過程並繪製類圖 二、實現步驟 根據題意,使用抽象工廠模式並畫出類圖,類圖中應包含一個抽象工廠類 AbstractFactory,PcFactory 和 MacF ...
一、案例背景
電腦包含記憶體(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());
}
}
}
- 運行結果
案例總結
抽象工廠模式主要適用於:
- 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節
- 系統中有多於一個的產品族,但每次只使用其中某一產品族
- 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來
- 產品等級結構穩定,在設計完成之後不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構