學習筆記-設計模式-創建型模式-工廠模式

来源:https://www.cnblogs.com/Andl-Liu/archive/2023/09/06/17681898.html
-Advertisement-
Play Games

### 工廠模式 工廠模式是一種創建者設計模式,細分之下可以分成三類`簡單工廠模式`,`工廠方法模式`和`抽象工廠模式`。 #### 簡單工廠模式 最簡單的工廠模式,它採用靜態方法的方式來決定應該應該生產什麼商品。 ```java public class StoreFactory { public ...


工廠模式

工廠模式是一種創建者設計模式,細分之下可以分成三類簡單工廠模式工廠方法模式抽象工廠模式

簡單工廠模式

最簡單的工廠模式,它採用靜態方法的方式來決定應該應該生產什麼商品。

public class StoreFactory {

    public static ICommodity getCommodityService(Integer commodityType) {
        if (null == commodityType) {
            return null;
        }

        switch (commodityType) {
            case 1:
                return new CouponCommodityService();
            case 2:
                return new GoodsCommodityService();
            case 3:
                return new CardCommodityService();
        }

        throw new RuntimeException("不存在的商品服務類型");
    }

}

它的優點在於

  • 將創建實例的工作與使用實例的工作分開,使用者不必關心類對象如何創建,實現瞭解耦
  • 把初始化實例時的工作放到工廠里進行,使代碼更容易維護,更符合面向對象的原則面向介面編程,而不是面向實現編程

它的缺點在於

  • 工廠類集中了所有實例的創建邏輯,一旦這個工廠不能正常工作,整個系統都會受到影響
  • 違背開閉原則,一旦添加新的產品就不得不修改工廠類的邏輯,這樣就會造成工廠邏輯過於複雜
  • 簡單工廠模式使用了靜態工廠方法,靜態方法不能被繼承和重寫,會造成工廠角色無法形成基於繼承的等級結構

它適用於

  • 客戶只知道傳入工廠類的參數,對於如何創建對象的邏輯不關心時;
  • 當工廠類負責創建的對象比較少時。

工廠方法模式

工廠方法模式中,工廠父類負責定義創建對象的公共介面,而子類則負責生成具體的對象。

它把類的實例化延遲到工廠類的子類中,由子類來決定應該實例化哪個類。

由此,它解決了簡單工廠模式違背了開閉原則的問題。

000.png

它的優點在於

  • 更符合開閉原則
  • 符合單一責任原則,每個具體工廠類只負責創建對應的產品
  • 不使用靜態工廠方法,可以形成基於繼承的等級結構

它的缺點在於

  • 需要的類的數量非常多,每添加一個新產品,就要相應的添加一個新的工廠。
  • 雖然保證了工廠方法內的對修改關閉,但對於使用工廠方法的類,如果要更換另一種產品,仍然需要修改實例化的具體工廠類
  • 一個工廠只能創建一種具體產品

它適用於:

  • 當一個類不需要知道它所需要的對象的類時
  • 當一個類希望通過其子類來指定創建對象時
  • 將創建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時無須關心是哪一個工廠子類創建產品子類,需要時再動態指定,可將具體工廠的類名存儲在配置文件或資料庫中(比如spring中的FactoryBean)

抽象工廠模式

抽象工廠模式定義了一個能生產一個產品族的超級抽象工廠,然後交給子類工廠去生產某一個產品族的產品。

產品族和產品等級

001.png

產品等級結構既是產品的繼承結構。比如一個抽象類是電視機,其子類有海爾電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構。

產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾生產的海爾電視機、海爾洗衣機和海爾冰箱,構成了一個產品族。

設計模式詳解

002.png

圖中,IProductFactory是工廠介面,定義了生產手機和路由器組成的產品族的方法。而子類工廠HuaweiFactory負責生產華為產品族,XiaomiFactory負責生產小米產品族。

另外,IPhoneProductIRouterProduct分別定義了手機和路由器兩個產品等級。

它的優點在於

  • 一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象
  • 可以很方便地添加一個新的產品族

它的缺點在於

  • 產品族的拓展非常困難,要增加一個系列的某一個產品,既要修改工廠抽象類里添加代碼,又要在具體的實現類裡面添加代碼
  • 增加了系統的抽象性和理解難度

它適用於

  • 一系列相關產品對象(屬於同一產品族)一起創建時需要大量的重覆代碼
  • 提供一個產品類的庫,所有的產品以同樣的介面出現,從而使得客戶端不依賴於具體的實現

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

-Advertisement-
Play Games
更多相關文章
  • ![file](https://img2023.cnblogs.com/other/2685289/202309/2685289-20230906105454530-376816477.jpg) > 導讀:國內某頭部理財服務提供商成立於 2019 年,是股份制銀行中首批獲准籌建、首家獲准開業、首家成 ...
  • 當談到[數據湖](https://www.dtstack.com/dtengine/easylake?src=szsm)的時候,大家都在說,可以把所有數據(結構化/半結構化/非結構化)一股腦都丟進去,進行統一的元數據管理。然後上層計算對接,進行[流批計算](https://www.dtstack.c ...
  • 浙江省工業和信息化廳開展了2023第二季度創新型中小企業評價工作,玖章算術以優秀的自主創新能力通過認定,成為浙江省2023年度創新型中小企業。玖章算術聚焦於雲計算與數據管理基礎技術領域,擁有豐富的研發經驗和專業技術團隊。NineData是新一代的雲原生智能數據管理平臺,包含了數據複製、SQL開發、數... ...
  • `` 數組的includes方法在日常的編程中比較常用到,其作用就是判斷某一數據是否在數組中,通常來說,數組中的數據如果是數字,布爾值,或者字元串的話,都是能夠進行判斷的 例如: ``` [1,2,3,4].includes(3) // true [1,2,3,4].includes(5) // f ...
  • 好家伙, 1.<template>去哪了 在正式內容之前,我們來思考一個問題, 當我們使用vue開發頁面時,<tamplete>中的內容是如何變成我們網頁中的內容的? 它會經歷四步: 解析模板:Vue會解析<template>中的內容,識別出其中的指令、插值表達式({{}}),以及其他元素和屬性。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一.@click和@click.native的區別 vue @click.native 原生點擊事件: 1,給vue組件綁定事件時候,必須加上native ,不然不會生效(監聽根元素的原生事件,使用 .native 修飾符) 2,等同於在 ...
  • 在vue3中,可以使用vue3的API `defineExpose()`函數結合`ref`或者`$parent`,實現父子組件數據的傳遞。 # 子組件向父組件傳遞數據`defineExpose()`和`ref` - 子組件:通過`defineExpose()` 函數,向外暴露響應式數據或者方法 `` ...
  • 本文給大家介紹了什麼是"編程範式",選擇合適的編程範式可以提高代碼的可讀性、可維護性和可擴展性。 一、 什麼是編程範式? "編程範式"是一種編程思想的總稱,它是指在編寫程式時所採用的基本方法和規範。常見的編程範式有面向對象、函數式、邏輯式等。 選擇合適的編程範式可以提高代碼的可讀性、可維護性和可擴展 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...