抽象工廠模式的運用

来源:https://www.cnblogs.com/jsanXin/archive/2023/03/23/17242616.html
-Advertisement-
Play Games

一、案例背景 電腦包含記憶體(RAM),CPU 等硬體設備,根據如圖所示的“產品等級結構-產品族示意圖”,使用抽象工廠模式實現電腦設備創建過程並繪製類圖 二、實現步驟 根據題意,使用抽象工廠模式並畫出類圖,類圖中應包含一個抽象工廠類 AbstractFactory,PcFactory 和 MacF ...


一、案例背景

電腦包含記憶體(RAM),CPU 等硬體設備,根據如圖所示的“產品等級結構-產品族示意圖”,使用抽象工廠模式實現電腦設備創建過程並繪製類圖

image

二、實現步驟

  1. 根據題意,使用抽象工廠模式並畫出類圖,類圖中應包含一個抽象工廠類 AbstractFactory,PcFactory 和 MacFactory 兩個具體工廠,CPU,RAM 兩個抽象產品類,PcCPU,MacCPU,PcRAM,MacRAM 四個具體產品類。## 根據題意,使用抽象工廠模式並畫出類圖,類圖中應包含一個抽象工廠類 AbstractFactory,PcFactory 和 MacFactory 兩個具體工廠,CPU,RAM 兩個抽象產品類,PcCPU,MacCPU,PcRAM,MacRAM 四個具體產品類。
  2. 根據類圖,實現上述類的具體代碼以及用戶類 Client 和輔助類 XMLUtil 以實現通過 XML 文件來製造不同的產品
  3. 更改 XML 中的屬性,觀察用戶類是否能使用不同的產品

三、實驗結果

  1. 項目UML類圖,如下:

image
2. 項目結構:

image
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());
        }
    }
}

  1. 運行結果

image

案例總結

抽象工廠模式主要適用於:

  • 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節
  • 系統中有多於一個的產品族,但每次只使用其中某一產品族
  • 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來
  • 產品等級結構穩定,在設計完成之後不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS 為實現重疊效果,將 margin-top 設為負值時,div 背景被 img 圖片遮擋 一、未實現重疊效果 <body> <img src="https://cdn.uviewui.com/uview/swiper/swiper2.png" style="width: 375px;" alt ...
  • <template> <el-button style="float: right; margin: 10px" type="primary" @click="export2">導出</el-button> <!-- 導出表格 start--> <el-table class="tableExpor ...
  • const: 這個最簡單,只需記住是聲明的常量,定義的時候必須聲明const的具體值,且之後不允許改變const的值 var和let區別 1、由於js引擎存在預解析,會把var變數名進行提升 對於var來說是這樣執行的 var m; console.log(m); m=10; let不存在變數提升, ...
  • ### canvas特性 標簽中的文本只有在瀏覽器下支持canvas標簽時才顯示 行內塊元素 高度設置在標簽屬性上 ### 填充色設置 ctx.fillStyle="#ff0000" ### 線條顏色設置 ctx.strokeStyle="ff0000" ### 線條粗細 ctx.lineWidth ...
  • 備忘錄模式(Memento Pattern):是一種行為型設計模式,在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。在JavaScript中,可以使用閉包來實現備忘錄模式。 備忘錄模式通常用於處理用戶界面的狀態。當用戶與應用程式交互時,應用程式會根據用戶的輸入更改其狀態。 ...
  • 在基於vue-next-admin 的 Vue3+TypeScript 前端項目中,可以整合自己的 .NET 後端,前端操作一些功能的時候,為了使用方便全局掛載的對象介面,以便能夠快速處理一些特殊的操作,如消息提示、輔助函數、正則測試等等。本篇隨筆介紹在Vue3+TypeScript 前端項目中全局... ...
  • 眾所周知,網頁的暗黑模式可以減少屏幕反射和藍光輻射,減少眼睛的疲勞感,特別是在夜間使用時更為明顯。其實暗黑模式也給霓虹燈效應(Neon Effect)提供了發揮的環境。 霓虹燈效應是一種視覺效果,其特點是在深色背景上使用鮮艷的顏色來產生強烈的視覺衝擊。這種效應通常用於設計海報、廣告、標誌和網頁等。霓 ...
  • 領域驅動設計(Domain Driven Design,簡稱:DDD)設計思想和方法論早在2005年時候就被提出來,但是一直沒有被重視和推薦使用,直到2015年之後微服務流行之後,再次被人重視和推薦使用。 下麵我來介紹一下DDD設計思想和方法論,同時結合我們在實際項目中應用總結和思考。 目錄 1、為 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...