每天一個設計模式-6 抽象工廠模式

来源:http://www.cnblogs.com/xiemubg/archive/2016/10/23/5990656.html
-Advertisement-
Play Games

每天一個設計模式-6 抽象工廠模式 1.生活的例子 組裝CPU主板時需要針腳匹配,那麼CPU和主板之間就有了關係,這也是和工廠方法模式的區別;抽象工廠的功能是為一系列相關對象或相互依賴的對象創建一個藉口,對象之間存在約束。工廠方法則是創建單個產品對象。 2.抽象工廠的定義 提供一個創建一系列相關或相 ...


每天一個設計模式-6 抽象工廠模式

1.生活的例子

組裝CPU主板時需要針腳匹配,那麼CPU和主板之間就有了關係,這也是和工廠方法模式的區別;抽象工廠的功能是為一系列相關對象或相互依賴的對象創建一個藉口,對象之間存在約束。工廠方法則是創建單個產品對象。

2.抽象工廠的定義

提供一個創建一系列相關或相互依賴對象的介面(產品簇),而無需指定他們具體的類。

3.抽象工廠實現CPU與主板的搭配

類圖:

AbstractFactory介面:聲明創建CPU和創建主板。

Schema1:(方案一)呼應前面說的產品簇,在這裡定義匹配的主板和CPU.。

Schema2:同上。

MainboardApi介面:聲明安裝主板的介面。

MSIMainboard:MainboardApi的一個實現。

GAMainboard:MainboardApi的一個實現。

。。。。

ComputerEngineer:裝機工程師類,通過用戶選擇裝機方案,裝機工程師調用抽象工廠完成用戶需求。

4.源代碼

抽象工廠介面:

public interface AbstractFactory {

    public CPUApi createCPUApi();

    public MainboardApi createMainboardApi();

}
AbstractFactory

方案一:

public class Schema1 implements AbstractFactory {

    public Schema1(){

    }

    public void finalize() throws Throwable {

    }

    public CPUApi createCPUApi(){
        System.out.println("啟用裝機方案:"+this.getClass().getName());
        return new AMDCPU(939);
    }

    public MainboardApi createMainboardApi(){
        System.out.println("啟用裝機方案:"+this.getClass().getName());
        return new MSIMainboard(939);
    }

}
Schema1

方案二:

public class Schema2 implements AbstractFactory {

    public Schema2(){

    }

    public void finalize() throws Throwable {

    }

    public CPUApi createCPUApi(){
        System.out.println("啟用裝機方案:"+this.getClass().getName());
        return new TntelCPU(1156);
    }

    public MainboardApi createMainboardApi(){
        System.out.println("啟用裝機方案:"+this.getClass().getName());
        return new GAMainboard(1156);
    }

}
Schema2

主板介面:

public interface MainboardApi {

    public void installCPU();

}
MainboardApi

主板的兩個實現類:

 

public class GAMainboard implements MainboardApi {

    private int cpuHoles;

    public GAMainboard(int cpuHoles){
        this.cpuHoles = cpuHoles;
    }

    public void finalize() throws Throwable {

    }

    public void installCPU(){
        System.out.println("此主板的支持的CPU針腳數為:"+cpuHoles+",開始安裝");
    }

}
GAMainboard
public class MSIMainboard implements MainboardApi {

    private int cpuHoles;

    public MSIMainboard(int cpuHoles){
        this.cpuHoles = cpuHoles;
    }

    public void finalize() throws Throwable {

    }

    public void installCPU(){
        System.out.println("此主板的支持的CPU針腳數為:"+cpuHoles+",並且開始安裝");
    }

}
MSIMainboard

CPU介面:

public interface CPUApi {

    public void calculate();

}
CPUApi

CPU的兩個實現類:

public class AMDCPU implements CPUApi {

    private int pins;

    public AMDCPU(int pins){
        this.pins = pins;
    }

    public void finalize() throws Throwable {

    }

    public void calculate(){
        System.out.println("使用AMDCPU進行計算");
    }

}
AMDCPU
public class TntelCPU implements CPUApi {

    private int PINS;

    public TntelCPU(int pins){
        PINS = pins;
    }

    public void finalize() throws Throwable {

    }

    public void calculate(){
        System.out.println("使用IntelCPU進行計算");
    }

}
TntelCPU

工程師類:

public class ComputerEngineer {
    private CPUApi cpu;
    private MainboardApi mainboard;
    public ComputerEngineer(){

    }

    public void finalize() throws Throwable {

    }
    public void makeComputer(AbstractFactory schema){
        //準備硬體
        prepareHardwares(schema);
    }
    private void prepareHardwares(AbstractFactory schema){
        //根據裝機方案選擇對應的CPU和主板
        this.cpu=schema.createCPUApi();
        this.mainboard=schema.createMainboardApi();
        //測試
        this.cpu.calculate();
        this.mainboard.installCPU();
    }
}
ComputerEngineer

客戶類:

public class Client {

    public static void main(String[] args) {
        //通過抽象工廠制定裝機方案,此時的抽象工廠就像一個方案
        AbstractFactory schema = new Schema1();
        //構造一個裝機工程師
        ComputerEngineer engineer = new ComputerEngineer();
        //工程師裝配電腦
        engineer.makeComputer(schema);
        

    }

}
Client

測試結果:

啟用裝機方案:Schema1
啟用裝機方案:Schema1
使用AMDCPU進行計算
此主板的支持的CPU針腳數為:939,並且開始安裝

一個抽象工廠就像一個裝機方案,也就是這個抽象工廠創建了正確的CPU與主板的匹配

5.抽象工廠的優缺點

優點:

分離介面和實現:客戶端使用抽象工廠來創建需要的對象,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的介面編程而已

切換產品簇變得容易:客戶只需選擇不同的裝機方案即可切換不同的產品簇。

缺點:

不太容易擴展新的產品:如果需要給全部的產品添加一個新的產品簇,那麼就需要修改抽象工廠,這樣會導致修改所有的工廠實現類。

6.總結

抽象工廠的本質選擇產品簇的實現。即:提供一個創建一系列相關或相互依賴的對象的介面(產品簇)。通過抽象工廠,將互相約束的對象封裝起來,使客戶端不能隨意選擇對象,防止出現對象間不匹配的問題。

 

 

博主寫博客不容易,轉載請註明出處,謝謝:   http://www.cnblogs.com/xiemubg/p/5990656.html


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

-Advertisement-
Play Games
更多相關文章
  • 深度優先搜索 # Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: ...
  • OJ搭建好了後,我們要熟悉一下OJ項目下的文件及文件夾。 首先,安裝好的OJ是在目錄var/www/html下。 html下的php文件 這些php文件都是些主要跳轉頁面。 admin文件夾 登錄管理員賬號後管理的管理界面 bootstrap文件夾 css樣式和圖片,如果要修改某些頁面的小地方請到w ...
  • 本節介紹TreeSet,相比HashSet,它有什麼不同?除了Set介面,它實現的SortedSet和NavigatableSet介面有哪些方法?它內部是如何實現的?... ...
  • ...
  • day03員工的添加,修改,刪除 修改功能 思路 : 點擊修改員工數據之後,跳轉到單行文本,查詢要修改的員工id的全部信息,主鍵id設置為readonly,其餘的都可以修改, 修改之後,提交按鈕,提交之後跳轉到全部員工界面 修改界面 : 部分代碼 : 刪除員工信息 那就相對簡單了,點擊刪除之後,帶上 ...
  • 轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/24269409 裝飾者模式:若要擴展功能,裝飾者提供了比集成更有彈性的替代方案,動態地將責任附加到對象上。 先簡單描述下裝飾者模式發揮作用的地方,當我們設計好了一個類,我們需要給這個 ...
  • 單件模式,也稱單例模式,用以創建獨一無二的、只能有一個實例的對象。 單件模式的類圖是所有模式的類圖中最簡單的——只有一個類。儘管從類設計的視角來看單件模式很簡單,但是實現上還是會遇到一些問題,本文著重對這一點來進行分析解決。 最簡單的單件模式的實現,代碼如下: 結合以上的代碼,對單件模式進行簡單的闡 ...
  • 本文主要論述設計模式中代理模式的原理和代碼實現,其中包含靜態代理和動態代理。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...