工廠模式詳情

一.介紹工廠模式的用途與特點

  • 工廠方法模式是一種創建型設計模式, 其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。
  • 定義工廠方法模式(Fatory Method Pattern)是指定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類,工廠方法讓類的實例化推遲到子類中進行
    工廠模式是一種常用的設計模式,它用來封裝對象的創建過程,以便在程序中隨時根據需要生成對象的實例。在工廠模式中,我們將對象的創建過程封裝在一個工廠類中,客戶端無需關心對象的創建過程,只需要調用工廠類的方法即可獲取到想要的對象。
    工廠模式常見的有三種形式:簡單工廠模式、工廠方法模式和抽象工廠模式。

二.簡單工廠模式

在這里插入圖片描述

使用后:
在這里插入圖片描述

1. 基本介紹

簡單工廠模式是最基本的工廠模式,它通過一個工廠類來創建不同類型的對象,而客戶端只需要傳遞不同的參數給工廠類即可獲得不同類型的對象實例。簡單工廠模式有三個角色:工廠類、抽象產品類和具體產品類。其中,工廠類負責創建不同類型的對象,抽象產品類定義了產品的公共接口,具體產品類則實現了不同類型產品的具體生產過程。

2. 傳統的方式的改進

例子:
比如我們這時要新增加一個Pizza的種類(Pepper披薩),我們需要做如下修改.
改進的思路分析 :
分析:修改代碼可以接受,但是如果我們在其它的地方也有創建Pizza的代碼,就意味著,也需要修改,而創建Pizza的代碼,往往有多處。
思路:把創建Pizza對象封裝到一個類中,這樣我們有新的Pizza種類時,只需要修改該類就可,其它有創建到Pizza對象的代碼就不需要修改了。(簡單工廠模式)

3. 項目應用-i18n國際演示

語言的切換

public class Software {public static void main(String[] args) {I18n i18n = I18NFactory.getI18NObject("china");System.out.println(i18n.getTitle());}
}
public interface I18n {public String getTitle();
public class I18NFactory {public static I18n getI18NObject(String area){if (area.equals("china")){return new Chinese();}else if (area.equals("spain")){return new Spainish();}else if (area.equals("italy")) {return new Italian();} else {return null;}}
}
public class Spainish implements I18n{public String getTitle(){return "Sistema de gestion del personal";}
}
public class Italian implements I18n{public String getTitle(){return "Sistema della direzione del personale";}
}
public class Chinese implements I18n{public String getTitle(){return "人事管理系統";}
}

好處:功能與功能之間更加明確,之間的耦合度降低

4. 簡單工廠模式的優缺點

優點是實現了對象創建和使用的職責分離,c端不需要知道創建產品的具體過程,在不修改任何代碼的情況下可以增加新的具體產品類
缺點是違反了設計模式的ocp原則,即對擴展開放,對修改關閉。即當我們給類增加新功能的時候,就需要修改工廠類。在產品類型較多的情況下工廠邏輯會變復雜,不利于維護。

二.工廠方法模式

工廠方法模式是簡單工廠模式的一種變形形式,它對簡單工廠模式進行了更細粒度的劃分,通過定義工廠接口和工廠實現類的方式,讓每個工廠只生產一種產品,從而更好地滿足開閉原則。工廠方法模式同樣有三個角色:抽象工廠類、抽象產品類和具體產品類。在工廠方法模式中,每個具體產品類都對應一個具體的工廠類,客戶端需要知道的是具體的工廠實現類,通過它來創建所需要的對象實例。
在這里插入圖片描述

抽象工廠

public interface FactoryI18n {I18n create();
}
public class FactoryItalian implements FactoryI18n{@Overridepublic Italian create() {return new Italian();}
}
public class FactoryChinese implements FactoryI18n {@Overridepublic Chinese create() {return new Chinese();}
}

抽象產品

abstract class I18n {public I18n(){}
}public class Italian extends I18n{public Italian() {System.out.println("Sistema della direzione del personale");}
}public class Chinese extends I18n{public Chinese(){System.out.println("人事管理系統");}
}

客戶端

public class Software{public static void main(String[] args) {FactoryChinese factoryChinese = new FactoryChinese();Chinese chinese = factoryChinese.create();FactoryItalian factoryItalian = new FactoryItalian();Italian software = factoryItalian.create();}
}

三.抽象工廠模式

抽象工廠模式是對工廠方法模式的一種擴展,它也是針對多個產品族的情況下設計的,它不僅需要提供產品的創建方法,還需要提供創建產品族的方法。在抽象工廠模式中,抽象工廠類定義了創建產品組的方法,而具體工廠類則負責生產產品組,每個產品組中包含多個產品,即每個工廠將生產多個產品,而每個產品又分別由不同的具體工廠進行實現。
在這里插入圖片描述

在這里插入圖片描述

//發動機型號
public interface Engine {
}
public class EngineA implements Engine {public EngineA(){System.out.println("制造-->EngineA");}
}
public class EngineB implements Engine {public EngineB(){System.out.println("制造-->EngineB");}
}//空調型號
public interface Aircondition {
}
public class AirconditionA implements Aircondition{public AirconditionA(){System.out.println("制造-->AirconditionA");}
}
public class AirconditionB implements Aircondition{public AirconditionB(){System.out.println("制造-->AirconditionA");}
}
//創建工廠接口
public interface AbstractFactory {//制造發動機public Engine createEngine();//制造空調public Aircondition createAircondition();
}public class FactoryBMW320 implements AbstractFactory{@Overridepublic Engine createEngine() {return new EngineA();}@Overridepublic Aircondition createAircondition() {return new AirconditionA();}
}public class FactoryBMW523 implements AbstractFactory {@Overridepublic Engine createEngine() {return new EngineB();}@Overridepublic Aircondition createAircondition() {return new AirconditionB();}
}
public class Custormer {public static void main(String[] args) {//生產報名320系列配件FactoryBMW320 factoryBMW320 = new FactoryBMW320();factoryBMW320.createEngine();factoryBMW320.createAircondition();//生成寶馬523系列配件FactoryBMW523 factoryBMW523 = new FactoryBMW523();factoryBMW523.createEngine();factoryBMW523.createAircondition();}
}

四.工廠模式小結

  1. 工廠模式的意義
    將實例化對象的代碼提取出來,放到一個類中統一管理和維護,達到和主項目的依賴關系的解耦。從而提高項目的擴展和維護性。
  2. 三種工廠模式 (簡單工廠模式、工廠方法模式、抽象工廠模式)
  3. 設計模式的依賴抽象原則
  4. 創建對象實例時,不要直接 new 類, 而是把這個new 類的動作放在一個工廠的方法中,并返回。有的書上說,變量不要直接持有具體類的引用。
  5. 不要讓類繼承具體類,而是繼承抽象類或者是實現interface(接口)
  6. 不要覆蓋基類中已經實現的方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19806.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python導出Jira列表

import requests import urllib3 urllib3.disable_warnings() from jira import JIRA import pandas as pd def login_jira(username,password):jira JIRA("https://jira.cn/",basic_auth(username,password))#projectsjira.project(id13)# jqlproject"云鏈-…

基于強化學習的控制率參數自主尋優

1.介紹 針對控制建模與設計場景中控制參數難以確定的普遍問題,提出了一種基于強化學習的控制律參數自主優化解決方案。該方案以客戶設計的控制律模型為基礎,根據自定義的控制性能指標,自主搜索并確定最優的、可狀態依賴的控制參數組合。 可…

unity打包的WebGL部署到IIS問題

部署之后會出錯,我遇到的有以下幾種; 進度條卡住不動 明明已經部署到了IIS上,為什么瀏覽網頁的時候還是過不去或者直接報錯。 進度條卡住不動的問題其實就是wasm和data的錯誤。 此時在瀏覽器上按F12進入開發者模式查看錯誤(下圖…

前端知識點雜記

本文章用于記錄前端學習中遇到的瑣碎問題及解決方法,歡迎大家一起學習補充~ 前端如何獲取UUID發送至后端? 1. 命令行下載uuid庫 npm install uuid 2. 工程導入uuid庫 import { v4 as uuidv4 } from "uuid"; 3. 使用方法生成uuid實例 co…

付費工具邏輯

1.付費推廣目的: 傳播信息心理暗示;擴大銷售,指導消費;樹立形象,塑道品牌; 2.付費和免費廣告: 付費主要為了增加曝光;免費廣告一般比付費廣告轉化率高; 3.平臺廣告交…

《Kubernetes部署篇:基于麒麟V10+ARM64架構部署harbor v2.4.0鏡像倉庫》

總結:整理不易,如果對你有幫助,可否點贊關注一下? 更多詳細內容請參考:企業級K8s集群運維實戰 一、環境信息 K8S版本 操作系統 CPU架構 服務版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…

chrome谷歌瀏覽器開啟Gemini Nano模型

前提 確保您的操作系統語言設置為英語(美國) 可能還需要將 Chrome 瀏覽器的語言更改為英語(美國)。 下載dev或Canary版本Chrome Chrome Canary Chrome Dev 注意:確認您的版本高于 127.0.6512.0。 其中一個Chrome版本不行就切換另外一個版本 繞過性能檢查 Tab輸入: …

中國美業元宇宙-探索美容行業的未來

隨著科技的不斷進步和數字化轉型的深入,元宇宙作為一種全新的虛擬現實交互平臺,正逐漸成為推動多個行業革新的重要力量。在這種背景下,中國美業也在積極擁抱元宇宙,希望通過這一新興技術為傳統美容行業帶來創新與發展。 #### 中國…

結構體相關習題的補充

結構體相關習題的補充 題目1: 如有以下代碼: struct student {int num;char name[32];float score; }stu;則下面的敘述不正確的是:( ) A.struct 是結構體類型的關鍵字 B.struct student 是用戶定義的結構體類型 C.num, score 都是結構體…

正邦科技(day4)

燒錄 一、燒錄固件二、 通訊模塊升級1:USB的方式升級固件2:通過mqtt的方式升級固件3:切換環境 三、 燒錄WiFi1:短接2:燒錄腳本 設備注意事項: 第一種方式:通信模組和MCU都可以統一燒錄BoodLoade…

Oracle Hint /*+APPEND*/插入性能總結

oracle append用法 Oracle中的APPEND用法主要用于提高數據插入的效率。 基本用法:在使用了APPEND選項后,插入數據會直接加到表的最后面,而不會在表的空閑塊中插入數據。這種做法不需要尋找freelist中的free block,從而避免了在…

【計算機畢設】基于Spring Boot的課程作業管理系統 - 源碼免費(私信領取)

免費領取源碼 | 項目完整可運行 | v:chengn7890 誠招源碼校園代理! 1. 研究目的 課程作業管理系統旨在為教師和學生提供一個便捷的平臺,用于發布、提交和評定課程作業。本系統旨在提高作業管理的效率,促進教…

Golang反射

文章目錄 基本介紹reflect包reflect.Typereflect.Valuereflect.Kind具體類型、空接口與reflect.Value的相互轉換 反射應用場景修改變量的值訪問結構體的字段信息調用變量所綁定的方法實現函數適配器創建任意類型的變量 基本介紹 基本介紹 在Go中,反射(re…

錯誤 0x80070570:文件或目錄損壞且無法讀取/無法訪問[拒絕訪問]-解決方法

1.起因:在挪動U盤文件時,出現無法移動的報錯提示: and無法訪問[拒絕訪問]: 2.原因[大多是胡亂拔出U盤] [來自0x80070570 文件或目錄損壞且無法讀取 CHKDSK 修復方法-CSDN博客&#…

iOS AVFoundation 音視頻源碼分享

引言 在現代移動開發中,音視頻處理是一個不可忽視的重要領域。iOS 提供了強大的 AVFoundation 框架,使開發者能夠輕松實現音視頻錄制、播放、編輯等功能。無論是創建高效的視頻播放器,還是實現復雜的音頻處理,AVFoundation 都能提…

Leecode---買賣股票最大利潤問題

121—題目(只能買賣一次): 給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所…

python-pytorch編寫transformer模型實現問答0.5.00--訓練和預測

python-pytorch編寫transformer模型實現問答0.5.00--訓練和預測 背景代碼訓練預測效果背景 代碼寫不了這么長,接上一篇 https://blog.csdn.net/m0_60688978/article/details/139360270 代碼 # 定義解碼器類 n_layers = 6 # 設置 Decoder 的層數 class Decoder(nn.Module)…

【JavaEE進階】——帶你詳細了解Spring日志以及配置日志

目錄 🚩Spring日志的認識 🚩Spring日志的作用 🚩觀察日志 🚩使用日志 🎈在程序中得到日志對象 🎈使??志對象輸出要打印的內容 🚩日志框架的介紹 🎈門面模式(外觀模式&…

Unity實現簡單的第一人稱控制

先看效果 實現方式 1.首先創建一個腳本 2.編輯腳本內容 付上腳本代碼 private float RotationX 0;public float speed 2f;//移動速度// Use this for initializationvoid Start(){Cursor.lockState CursorLockMode.Locked;//鎖定鼠標到中心點Cursor.visible false;//隱藏鼠…

(CPU/GPU)粒子繼承貼圖顏色發射

GetRandomInfo節點(復制貼進scratch pad Scripts) Begin Object Class/Script/NiagaraEditor.NiagaraClipboardContent Name"NiagaraClipboardContent_22" ExportPath/Script/NiagaraEditor.NiagaraClipboardContent"/Engine/Transient.NiagaraClipboardConten…