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

来源: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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...