詳解23種設計模式優缺點以及解決方案

1. 單例模式(Singleton Pattern):

  • 優點:確保一個類只有一個實例,提供全局訪問點,節省資源。
  • 缺點:可能引入全局狀態,難以擴展和測試。
  • 解決方法:使用依賴注入來替代直接訪問單例對象,以便更好地控制依賴關系和測試。

2. 工廠模式(Factory Pattern):

  • 優點:封裝對象的創建,客戶端代碼與具體類解耦。
  • 缺點:增加了代碼復雜性,需要額外的工廠類。
  • 解決方法:使用抽象工廠模式,將具體工廠的創建抽象化,提供更高層次的抽象。

3. 抽象工廠模式(Abstract Factory Pattern):

  • 優點:提供一種創建相關對象家族的接口,客戶端代碼與具體類解耦。
  • 缺點:增加了代碼復雜性,難以支持新類型的產品。
  • 解決方法:使用依賴注入和反射機制來動態創建產品實例,增加靈活性。

4. 建造者模式(Builder Pattern):

  • 優點:將構建復雜對象的過程與其表示分離,靈活性高,易于擴展。
  • 缺點:增加了代碼量,需要定義多個類。
  • 解決方法:使用流暢接口(Fluent Interface)來簡化構建過程,提供更好的可讀性。

5. 適配器模式(Adapter Pattern):

  • 優點:將不兼容的接口轉換為客戶端所期望的接口,提供了接口的轉換和重用。
  • 缺點:增加了代碼復雜性,需要創建適配器類。
  • 解決方法:使用接口適配器模式,減少適配器類的數量,使用默認適配方法。

6. 橋接模式(Bridge Pattern):

  • 優點:將抽象部分與實現部分解耦,可以獨立地進行擴展。
  • 缺點:增加了代碼復雜性,需要定義多個類。
  • 解決方法:使用組合和依賴注入來替代繼承,使得抽象和實現可以獨立變化。

7. 組合模式(Composite Pattern):

  • 優點:將對象組合成樹形結構,統一處理單個對象和對象集合。
  • 缺點:限制了組合對象的類型,可能導致設計過度。
  • 解決方法:使用接口來定義組合對象,靈活處理不同類型的組合對象。

8. 裝飾器模式(Decorator Pattern):

  • 優點:動態地給對象添加額外的職責,避免使用子類進行擴展。
  • 缺點:增加了代碼復雜性,可能導致過多的裝飾器層級。
  • 解決方法:使用透明裝飾器模式,確保裝飾器和被裝飾對象具有相同的接口。

9. 外觀模式(Facade Pattern):

  • 優點:提供了一個簡化的接口,隱藏了系統的復雜性。
  • 缺點:可能會違背單一職責原則,導致外觀對象過于龐大。
  • 解決方法:合理劃分外觀的職責,遵循單一職責原則,將復雜任務委派給其他對象。

10. 享元模式(Flyweight Pattern):

  • 優點:共享細粒度對象,減少內存使用和提高性能。
  • 缺點:增加了代碼復雜性,需要維護共享對象的狀態。
  • 解決方法:使用對象池來管理共享對象,避免手動維護共享對象的狀態。

11. 代理模式(Proxy Pattern):

  • 優點:為其他對象提供一種代理,控制對對象的訪問。
  • 缺點:增加了代碼復雜性,可能會降低性能。
  • 解決方法:使用動態代理來延遲對象的創建和方法的執行,提高靈活性和性能。

12. 責任鏈模式(Chain of Responsibility Pattern):

  • 優點:將請求的發送者和接收者解耦,通過鏈式傳遞請求。
  • 缺點:可能導致請求的處理鏈過長,難以調試和定位錯誤。
  • 解決方法:合理劃分責任鏈的職責,避免過長的鏈條,增加錯誤處理機制。

13. 命令模式(Command Pattern):

  • 優點:將請求封裝成對象,使得可以用不同的請求對客戶進行參數化。
  • 缺點:可能導致命令類的膨脹,增加了代碼復雜性。
  • 解決方法:使用函數式接口和Lambda表達式來簡化命令對象的創建和使用。

14. 解釋器模式(Interpreter Pattern):

  • 優點:定義了一種語言的文法表示,并提供解釋器來解釋語言中的表達式。
  • 缺點:增加了代碼復雜性,難以擴展和維護。
  • 解決方法:使用現有的解釋器框架和工具來簡化解釋器的實現。

15. 迭代器模式(Iterator Pattern):

  • 優點:提供一種方法順序訪問聚合對象中的元素,而不暴露其內部表示。
  • 缺點:增加了代碼復雜性,需要實現迭代器接口。
  • 解決方法:使用Java 8引入的Stream API來簡化集合的遍歷和操作。

16. 中介者模式(Mediator Pattern):

  • 優點:用一個中介對象來封裝一系列對象之間的交互,減少對象之間的直接依賴。
  • 缺點:增加了代碼復雜性,中介者對象可能會變得龐大。
  • 解決方法:將中介者對象拆分成多個小的中介者對象,提高靈活性和可維護性。

17. 備忘錄模式(Memento Pattern):

  • 優點:在不破壞封裝的前提下,捕獲并保存對象的內部狀態,以便后續恢復。
  • 缺點:增加了代碼復雜性,可能會占用大量內存。
  • 解決方法:使用序列化和持久化技術來保存和恢復對象的狀態,減少內存占用。

18. 觀察者模式(Observer Pattern):

  • 優點:定義了一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動更新。
  • 缺點:可能導致觀察者對象過多,難以維護。
  • 解決方法:使用現有的觀察者框架和庫來簡化觀察者的實現和管理。

19. 狀態模式(State Pattern):

  • 優點:允許對象在其內部狀態改變時改變其行為,使得狀態轉換更加明確和可控。
  • 缺點:增加了代碼復雜性,需要定義多個狀態
  • 解決方案:
    • 使用狀態模式需要根據實際情況進行權衡和設計,避免狀態類過多和過于復雜。
    • 可以使用享元模式來共享相同狀態的對象,減少對象的數量。
    • 可以使用策略模式來替代某些簡單的狀態,減少狀態類的數量。

20. 策略模式(Strategy Pattern):

  • 優點:定義了一系列算法,并將每個算法封裝到獨立的類中,使得它們可以互相替換。提供了靈活的算法選擇和擴展性。
  • 缺點:客戶端需要了解不同的策略類,增加了代碼的復雜性。
  • 解決方法:使用工廠模式創建策略對象,并通過依賴注入將策略對象傳遞給客戶端。

21. 模板方法模式(Template Method Pattern):

  • 優點:定義了一個算法的框架,將具體步驟延遲到子類中實現。提供了一種代碼復用和擴展的方式。
  • 缺點:子類的擴展可能會影響算法的整體結構。
  • 解決方法:使用鉤子方法來允許子類影響算法的執行過程,提供更大的靈活性。

22. 訪問者模式(Visitor Pattern):

  • 優點:將數據結構和對數據的操作分離,使得可以在不改變數據結構的前提下定義新的操作。
  • 缺點:增加了代碼復雜性,需要在數據結構中添加訪問者接受方法。
  • 解決方法:使用反射機制來動態調用訪問者的方法,減少對數據結構的侵入性。

23. 職責鏈模式(Chain of Responsibility Pattern):

  • 優點:將請求的發送者和接收者解耦,動態地組織處理鏈。
  • 缺點:可能導致請求的處理鏈過長,難以調試和定位錯誤。
  • 解決方法:合理劃分責任鏈的職責,增加錯誤處理機制,例如添加默認處理器或者拋出異常來處理未匹配的請求。

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

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

相關文章

通過 Amazon SageMaker JumpStart 部署 Llama 2 快速構建專屬 LLM 應用

來自 Meta 的 Llama 2 基礎模型現已在 Amazon SageMaker JumpStart 中提供。我們可以通過使用 Amazon SageMaker JumpStart 快速部署 Llama 2 模型,并且結合開源 UI 工具 Gradio 打造專屬 LLM 應用。 Llama 2 簡介 Llama 2 是使用優化的 Transformer 架構的自回歸語…

【JavaEE基礎學習打卡04】JDBC之MySQL數據庫安裝

目錄 前言一、JDBC與數據庫二、MySQL數據庫1.MySQL數據庫2.MySQL服務下載安裝3.MySQL服務啟動停止4.MySQL命令 三、MySQL客戶端安裝總結 前言 📜 本系列教程適用于JavaWeb初學者、愛好者,小白白。我們的天賦并不高,可貴在努力,堅持…

【 Cocos Creator 項目實戰】益智游戲《2048》(附帶完整源碼工程)

本文乃Siliphen原創,轉載請注明出處 目錄 游戲介紹 概述 游戲整體流程 游戲框架設計 主要流程控制類 本文項目的代碼組織結構 構建游戲世界 數字方塊 地圖 觸摸手勢識別 防觸摸抖動 判斷用戶輸入的方向 地圖 任意大小的地圖 初始化地圖大小 地圖繪制…

數據結構----結構--線性結構--棧,隊列

數據結構----結構–線性結構–棧,隊列 一.棧:Stack 1.棧的特點: ? 先進后出:FILO(對一組數據有倒敘要求時可以用棧) 2.棧的實現 順序存儲:數組實現: ? 缺點:空間…

無涯教程-Perl - sysread函數

描述 該函數等效于C /操作系統函數read(),因為它繞過了諸如print,read和seek之類的函數所采用的緩沖系統,它僅應與相應的syswrite和sysseek函數一起使用。 它從FILEHANDLE中讀取LENGTH個字節,并將輸出放入SCALAR中。如果指定了OFFSET,則將數據從OFFSET字節寫入SCALAR,從而有效…

IC流程中 DFT 學習筆記(2)

引言 DFT是ASIC芯片設計流程中不可或缺的環節。其主要目的是在芯片前端設計驗證完成后插入一些諸如寄存器鏈等可供測試的邏輯,算是IC后端設計的范疇,屬于結構測試而非功能測試。主要是在ASIC芯片流片完成后,通過這些已插入的邏輯&#xff0c…

手機照片誤刪怎么辦,電腦照片誤刪怎么辦怎么才能找回,EasyRecovery來幫您

手機照片誤刪怎么辦,電腦照片誤刪怎么辦怎么才能找回,EasyRecovery 2023來幫您!!! EasyRecovery 2023是一款操作安全、價格便宜、用戶自主操作的 數據恢復 方案,它支持從各種各樣的 存儲介質 恢復刪除 或者…

Vue3.X 創建簡單項目

一、環境安裝與檢查 首先,我們要確保我們安裝了構建vue框架的環境,不會安裝的請自行百度,有很多安裝教程。檢查環境 node -v # 如果沒有安裝nodejs請安裝,安裝教程自行百度 vue -V# 沒有安裝,請執行npm install -g v…

Cesium for unity 1.5.0使用注意事項

Cesium for Unity Quickstart – Cesium 1.Unity版本僅支持Unity2021.3.2f1以后版 2.僅支持 3D (URP)和3D (HDRP)渲染管線 3.如果Package Manager中不出現My Registries選項,請在 Edit > Project Settings...>Package Manager中重命名或刪除重新添加Packag…

深入淺出PHP封裝根據商品ID獲取淘寶商品詳情數據方法

要通過淘寶的API獲取商品詳情,您可以使用淘寶開放平臺提供的接口來實現。以下是一種使用PHP編程語言實現的示例,展示如何通過淘寶開放平臺API獲取商品詳情: 首先,確保您已注冊成為淘寶開放平臺的開發者,并創建一個應用…

【微服務實戰】01-工程結構概覽

文章目錄 工程結構概覽:定義應用分層及依賴關系1.應用分層2.定義Entity3.倉儲層3.1 工作單元:事務管理3.2 倉儲層 4.領域事件5.APIController最佳實踐 工程結構概覽:定義應用分層及依賴關系 1.應用分層 領域模型層基礎設施層 ? 倉儲應用層 ? Api、后臺任務Job共…

TCP服務器實現—多進程版,多線程版,線程池版

目錄 前言 1.存在的問題 2.多進程版 3.多線程版 4.線程池版 總結 前言 在上一篇文章中使用TCP協議實現了一個簡單的服務器,可以用來服務端和客戶端通信,但是之前的服務器存在一個問題,就是當有多個客戶端連接服務器的時候,服…

002-Spring boot 自動配置相關分析

目錄 自動配置 EnableAutoConfiguration開啟自動配置讀取配置提前過濾自動配置配置包 AutoConfigurationPackage 自動配置 EnableAutoConfiguration 開啟自動配置 在Spring 啟動類上的 SpringBootApplication 中有 EnableAutoConfiguration 讀取配置 Import(AutoConfigurat…

后端返回圖片,前端接收并顯示的解決方案

后端圖片數據返回 后端通過二進制流的形式,寫入response中 controller層 /*** 獲取簽到二維碼*/GetMapping("/sign-up-pict")public void signUpPict(Long id, Long semId, HttpServletResponse response) throws NoSuchAlgorithmException {signUpServ…

musl libc ldso 動態加載研究筆記:01

前言 musl 是一個輕量級的標準C庫,建立在系統調用之上,可以認為是【用戶態】的C 庫,與 glibc 或者 uClibc 屬于同一類。 基于 musl 的 gcc 工具鏈包括交叉編譯工具鏈,可以用于編譯 Linux 或者其他的操作系統,如當前 L…

深入解析 MyBatis 中的 <foreach> 標簽:優雅處理批量操作與動態 SQL

在當今的Java應用程序開發中&#xff0c;數據庫操作是一個不可或缺的部分。MyBatis作為一款頗受歡迎的持久層框架&#xff0c;為我們提供了一種優雅而高效的方式來管理數據庫操作。在MyBatis的眾多特性中&#xff0c;<foreach>標簽無疑是一個強大的工具&#xff0c;它使得…

構建可遠程訪問的企業內部論壇

文章目錄 前言1.cpolar、PHPStudy2.Discuz3.打開PHPStudy&#xff0c;安裝網頁論壇所需軟件4.進行網頁運行環境的構建5.運行Discuz網頁程序6.使用cpolar建立穿透內網的數據隧道&#xff0c;發布到公網7.對云端保留的空白數據隧道進行配置8.Discuz論壇搭建完畢 前言 企業在發展…

Python中import模塊導入的實現原理

歡迎關注博主 Mindtechnist 或加入【Linux C/C/Python社區】一起探討和分享Linux C/C/Python/Shell編程、機器人技術、機器學習、機器視覺、嵌入式AI相關領域的知識和技術。 Python中import模塊導入的實現原理 什么是模塊import搜索路徑import導入模塊的原理圖書推薦 專欄&…

京東門詳一碼多端探索與實踐 | 京東云技術團隊

本文主要講述京東門詳業務在支撐過程中遇到的困境&#xff0c;面對問題我們在效率提升、質量保障等方向的探索和實踐&#xff0c;在此將實踐過程中問題解決的思路和方案與大家一起分享&#xff0c;也希望能給大家帶來一些新的啟發 一、背景 1.1、京東門詳介紹 1.1.1、京東門…

VB+SQL上機考試系統設計與實現

摘 要 隨著計算機技術的迅猛發展,學校教學和管理的信息化發展也有長足的進步,這就要求各個環節都均衡發展,從軟硬件雙方面把學校建設成一流的信息管理、教育教學的平臺。本文設計開發的考試管理系統也是其中重要的一個方面。該系統本著減輕教師工作負擔、提高工作效率、優…