策略模式+工廠模式(案例實踐易懂版)

最近,可以說這2025年度,自己更文的次數都大大減少,主要最近大環境不景氣,自己職業也受到波及,學習的東西也是因為AI而變得更多,

沒辦法,你不學,總有人會學,關于AI的我也準備出個專輯,相信絕對幫助到大家

額,好像說多了,言歸正傳,我們看一下今天的主題:策略模式+工廠模式

本文主要是為了讓人懂并會用(哪怕你是一個小白,也能懂!!!)

那你說,我怎么還看不懂啊? 哈哈哈!你過來捶我

本文總綱:

文章目錄

    • 場景描述:
    • 1.定義策略接口(核心)
    • 2.實現具體策略類(真正得出不同容量的)
    • 工廠模式統一創建策略對象
    • 最后總結

為了讓大家能快速明白,我在這里直接以一個例子,帶大家實戰中理解,就不放那些一看就勸退的理論術語

這里我們就用羅總之前星巴克的點單(大杯,中杯)問題的實際場景,大白話解釋策略模式結合工廠模式的應用

場景描述:

假設現在羅總來到星巴克點一杯咖啡,羅總需要選擇 咖啡的杯子規格(超大杯,大杯,中杯),每種杯子規格對應不同的杯子容量

  • 超大杯 591mL 大杯473ML 中杯 354ML

為了靈活應比如羅總所說的杯容量,添加新杯規格容量,我們用策略模式封裝不同的規格容量的處理邏輯,并用工廠模式創建這些邏輯對象

1.定義策略接口(核心)

我們定義一個CapacityStrategy接口,這個接口對于后面杯子規格容量策略都需要實現這個接口!

為什么?

因為策略模式的核心也是最重要的就是:定義一系列算法,并封裝成獨立的類,目的是為了他們之間可以相互替換

比如我買咖啡,我之前選的中杯,我和服務員說不要中杯了給我來個超大杯,這個中杯和超大杯是平等的策略,我就可以替換

//杯子容量策略接口
public interface CapacityStrategy{//不同容量計算方法double calculateCapacity();
}

2.實現具體策略類(真正得出不同容量的)

如上面所述的中杯,大杯,超大杯分別對應不同的策略類

換句話說:就是此類真正干活的,給出到底杯子規格是多少的,如大杯的容量

點過奶茶的都知道吧,你掃碼奶茶小程序點餐頁面的選擇不同規格,其實就是用到了策略模式

好處: 靈活替換算法,代碼解耦

超大杯策略

public VentiCapacityStrategy implements CapacityStrategy{@Overridepublic double calculateCapacity(){return 591.0;}
}

大杯策略

public JorumCapacityStrategy implements CapacityStrategy{@Overridepublic double calculateCapacity(){return 473.0;}
}

中杯策略

public MediumCapacityStrategy implements CapacityStrategy{@Overridepublic double calculateCapacity(){return 354.0;}
}

工廠模式統一創建策略對象

這一步,就是你在小程序上選擇不同規格的容量如大杯還是中杯就行,不需要你關心后面大杯到底對應多少容量,這一塊尤我們創建的工廠模式類來創建對應的策略對象,就是由后臺自己指定對應的杯容量

好處:隱藏創建細節,統一的對象管理

//策略工廠
public class CapacityStrategyFactory{//根據不同容量創建返回對應的策略public static CapacityStrategy getStrategy(String capacityType){case "超大杯":return new VentiCapacityStrategy();case "大杯":return new JorumCapacityStrategy();case "中杯":return new MediumCapacityStrategy();default: throw new Exception("此規格暫不支持"+capacityType);}
}

最后一步,就是真正的操作實現,我點完選擇的奶茶如大杯規格,就給我做出了大杯

public class Shopper{public static void main(String[] args){//小程序選擇的規格容量String type="大杯";//通過工廠獲取對應的容量策略對象  創建CapacityStrategy strategy=CapacityStrategyFactory.getStrategy(type);//計算對應的規格容量double amount=strategy.calculateCapacity();//System.out.println("您選擇了"+type+",容量是:"+amount+"ml")}
}

最后總結

策略模式: 把變化的部分 (不同規格容量的計算邏輯) 封裝成獨立的類,目的是為了可以靈活的替換

工廠模式: 把對象的創建過程 封裝起來,就是讓客戶只需要選擇要什么就行,不需要知道怎么造

兩者結合:既保證了代碼的靈活性(策略可替換),又降低了客戶端的復雜度(無需關心對象創建)

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

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

相關文章

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - snowNLP庫實現中文情感分析

大家好,我是java1234_小鋒老師,最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程,持續更新中,計劃月底更新完,感謝支持。今天講解snowNLP庫實現中文情感分析 視頻在線地址&…

大根堆,小根堆,雙指針

碼蹄集OJ-大約 #include<bits/stdc.h> using namespace std; priority_queue<int>max2,maxDel; priority_queue<int,vector<int>,std::greater<int>>min2,minDel; const int N1e51; int n,result0,a[N]; int main( ) {cin>>n;for(int i1…

RS485和Modbus

UART協議中&#xff0c;空閑狀態為高電平&#xff0c;也就是1,R25和R27&#xff0c;485收發器特性MAX485 (美信)SSP485 (國產替代)AZRS3080 (安格)供電電壓5V5V3.3V ~ 5.5V靜態電流300μA (接收模式)120μA (接收模式)150μA (接收模式)傳輸速率2.5Mbps10Mbps20Mbps總線負載能力…

【Android】交叉編譯faiss庫 | 問題解決

目錄 一 解決 FAISS 交叉編譯到 Android 時的 BLAS/MKL 依賴問題 二 交叉編譯faiss ■禁用 BLAS并交叉編譯faiss ■使用 OpenBLAS 的 Android 移植版本并交叉編譯faiss 三 報錯處理 ■報錯 ■SWIG 一 解決 FAISS 交叉編譯到 Android 時的 BLAS/MKL 依賴問題

《使用 IDEA 部署 Docker 應用指南》

使用 IDEA 部署 Docker 應用的詳細步驟 一、創建 Dockerfile 配置文件 在項目根目錄下創建Dockerfile文件&#xff0c;配置內容如下&#xff1a; # 使用官方的OpenJDK鏡像作為基礎鏡像 FROM openjdk:17-jdk-slim# 設置維護者信息(可選) LABEL maintainer"三木豪"# 設…

【Docker#3】Window 和 Linux 上 docker安裝 相關知識

前置了解&#xff1a; X86 高并發&#xff1a;基于 x86 架構的處理器&#xff0c;在高負載下處理大量并發請求的能力。ARM &#xff1a;使用 ARM 架構處理器的移動設備&#xff0c;具有低功耗和高性能的特點。 操作系統&#xff1a; CentOS&#xff1a;基于 Red Hat Enterprise…

一次 POI 版本升級踩坑記錄

前言 結論先行。 開發過程中由于可能涉及到二次開發&#xff0c;若原系統開發時間久遠&#xff0c;沒有達成一致規范設計&#xff0c;導致風格各異&#xff0c;確實滿足當時開發場景&#xff0c;但增大了后續的更新的難度&#xff0c;容易出現俄羅斯套娃現象&#xff0c;新的更…

硬件設計學習DAY13——電源緩沖電路設計全解

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.緩沖電路介紹 1.1緩沖電路的作用 1.2寄生參數的來源 1.3緩沖電路的類型 1.4常見緩沖電路設計 1.5設計原則 二.吸收與緩沖 2.1吸收與緩沖的核心作用 2.2電壓尖峰與吸收措…

鴻蒙搜狐新聞如何在Native調用ArkTS方法

01前言鴻蒙作為一款新興的智能操作系統&#xff0c;現在適配鴻蒙系統的應用越來越多&#xff0c;同時會面臨三端兼容問題&#xff0c;如同一產品功能&#xff0c;需要維護iOS、Android、鴻蒙三端代碼。拿文件上傳、下載功能場景舉例&#xff0c;同時要適配iOS、Android、鴻蒙三…

Java行為型模式---中介者模式

中介者模式基礎概念中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是通過一個中介對象來封裝一系列對象之間的交互&#xff0c;使各對象不需要顯式地相互引用&#xff0c;從而降低耦合度&#xff0c;并可以獨立地改變它們之間…

Python爬蟲實戰:研究Korean庫相關技術

一、引言 1.1 研究背景與意義 隨著韓流文化在全球的傳播,韓語網頁內容急劇增加。韓國在科技、娛樂等領域的信息具有重要研究價值。然而,韓語獨特的黏著語特性(如助詞體系、詞尾變化)給信息處理帶來挑戰。傳統爬蟲缺乏對韓語語言特點的針對性處理,本研究旨在開發一套完整…

表單校驗--數組各項獨立校驗

寫需求時遇到一個這樣的問題&#xff0c;就是校樣項是多個的&#xff0c;但是其字段名稱相同這時我們可以這樣校驗&#xff0c;注意字段之間的關聯性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的歷史敘事GIS展示-以哪吒2的海外國家上映安排為例

目錄 前言 一、哪吒2的海外之路 1、海外征戰歷程 2、上映國家空間查詢 二、后端接口的實現 1、模型層的實現 2、上映時間與國家 3、控制層的實現 三、基于leaflet-timeline-slider的前端實現 1、時間軸控件的引入及定義 2、時間軸綁定事件 3、成果展示 四、總結 前言…

tar 解壓:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解壓 tar.gz 壓縮包報錯&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用戶執行的解壓縮腳本&#xff0c;用root用戶執行tar解壓縮&…

騰訊客戶端開發面試真題分析

以下是針對騰訊客戶端開發工程師面試問題的分類與高頻問題分析&#xff08;基于??105道問題&#xff0c;總出現次數118次??&#xff09;。按技術領域整合為??7大類別??&#xff0c;按占比排序并精選高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#x…

線上問題排查之【CPU飆高100%】

目錄 案例 發現問題 排查問題 步驟一 步驟二 步驟三 案例 import java.util.concurrent.TimeUnit;/*** 簡單寫一個CPU飆高的案例*/ public class CpuLoadUp {// 這里定義了一個標識private volatile static int flag 0;public static void main(String[] args) {// 執行…

c語言 進階 動態內存管理

動態內存管理1. 為什么存在動態內存分配2. 動態內存函數的介紹?2.1 malloc 和 freemalloc 函數free 函數2.2內存泄漏2.3 calloc2.4 realloc3. 常見的動態內存錯誤3.1 對NULL指針的解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放一塊…

Redis的五大基本數據類型

一、Redis基本知識與Redis鍵&#xff08;key&#xff09;常用操作命令。redis的默認端口6379。mysql默認端口號3306。 默認16個數據庫&#xff0c;類似數組的下標從0開始&#xff0c;初始默認使用0號庫。可以使用select index來切換數據庫&#xff0c;如&#xff1a;select 1&a…

達夢數據庫JSON_TABLE使用說明

在達夢數據庫&#xff08;DM Database&#xff09;中&#xff0c;將 JSON 數據轉換為表格形式可以使用內置的 JSON_TABLE 函數。以下是詳細步驟和示例&#xff1a;1. 核心函數&#xff1a;JSON_TABLE JSON_TABLE 用于將 JSON 數據解析為關系表結構&#xff0c;支持從 JSON 對象…

A316-1926-V1 USB多路高清音頻解碼器模組技術解析

隨著數字音頻技術的不斷發展&#xff0c;高品質音頻解決方案的需求日益增長。本文將介紹一款基于XMOS技術的高性能USB音頻解碼器模組——A316-1926-V1&#xff0c;這是一款專為高清音頻應用設計的專業模組。核心技術與特性A316-1926-V1是一款集成了多項先進技術的USB多路高清音…