【設計模式】簡單工廠模式,工廠模式,抽象工廠模式,單例,代理,go案例區分總結

工廠模式三種類型:

一、簡單工廠模式(Simple Factory)

定義: 用一個工廠類,根據傳入的參數決定創建哪一種具體產品類實例。

面試說法: 由一個統一的工廠創建所有對象,增加新產品時需要修改工廠類,不符合OCP開閉原則。

OCP原則:
對擴展開放(Open for extension):軟件中的功能應該允許通過新增代碼來進行擴展。
對修改關閉(Closed for modification):原有代碼不應該被修改,以減少引入 bug 的風險。

Go 實現:

type PayMethod interface {Pay(amount float64)
}type AliPay struct{}
func (a *AliPay) Pay(amount float64) {fmt.Println("使用支付寶支付", amount)
}type WeChatPay struct{}
func (w *WeChatPay) Pay(amount float64) {fmt.Println("使用微信支付", amount)
}func PayFactory(channel string) PayMethod {switch channel {case "alipay":return &AliPay{}case "wechat":return &WeChatPay{}default:return nil}
}

二、工廠方法模式(Factory Method)

定義: 把創建對象的邏輯下放到每個具體工廠類,遵循了開閉原則。

面試說法: 一個抽象工廠接口 + 多個具體工廠類,每種產品由對應工廠類負責創建。符合開閉原則,新增產品時不修改已有代碼,只需新增工廠類。

Go 實現:

type PayMethod interface {Pay(amount float64)
}type PayFactory interface {CreatePayMethod() PayMethod
}type AliPay struct{}
func (a *AliPay) Pay(amount float64) {fmt.Println("使用支付寶支付", amount)
}type AliPayFactory struct{}
func (f *AliPayFactory) CreatePayMethod() PayMethod {return &AliPay{}
}type WeChatPay struct{}
func (w *WeChatPay) Pay(amount float64) {fmt.Println("使用微信支付", amount)
}type WeChatPayFactory struct{}
func (f *WeChatPayFactory) CreatePayMethod() PayMethod {return &WeChatPay{}
}

三、抽象工廠模式(Abstract Factory)

定義: 提供一系列產品創建的接口,每個具體工廠創建一整套產品。

面試說法: 用于創建一系列相關產品,適用于產品族的擴展。每個工廠可以返回多個產品實例,如 UI 工廠創建按鈕、窗口、滾動條等。

Go 實現:

// 抽象產品
type Pay interface {Pay(amount float64)
}
type Refund interface {Refund(amount float64)
}// 抽象工廠
type PayFactory interface {CreatePay() PayCreateRefund() Refund
}// 支付寶產品實現
type AliPay struct{}
func (a *AliPay) Pay(amount float64) {fmt.Println("支付寶支付", amount)
}
type AliRefund struct{}
func (a *AliRefund) Refund(amount float64) {fmt.Println("支付寶退款", amount)
}// 支付寶工廠
type AliFactory struct{}
func (f *AliFactory) CreatePay() Pay {return &AliPay{}
}
func (f *AliFactory) CreateRefund() Refund {return &AliRefund{}
}

面試中該如何答工廠模式的區別?

  1. 簡單工廠模式

    • 優點:結構簡單,適用于產品數量較少、需求變化不頻繁的場景。
    • 缺點:不符合開閉原則,新增產品需要修改工廠代碼。
    • 應用場景:支付渠道種類少的項目、快速原型開發。
  2. 工廠方法模式

    • 優點:符合開閉原則,新增產品時只需新增具體工廠類,擴展性好。
    • 缺點:類的數量增加,結構相對復雜。
    • 應用場景:產品頻繁擴展變化的系統,例如支持多個支付渠道,未來還會新增。
  3. 抽象工廠模式

    • 優點:可以創建一整套相關聯的產品(產品族),一致性強。
    • 缺點:不方便支持新增產品種類(每個工廠都要改),靈活性略低。
    • 應用場景:跨平臺開發、UI 工具包、數據庫驅動(同一工廠生產連接器和執行器等)。

“簡單工廠是最基本的一種模式,用一個工廠創建所有對象,不符合開閉原則。工廠方法將創建邏輯分離到每個工廠類,支持擴展。抽象工廠則用于生產一組相關產品,產品族統一,適合跨平臺系統。”

工廠模式
? 通常只有一個抽象工廠接口多個具體工廠實現類,每個工廠創建一種產品
抽象工廠模式
? 有一個抽象工廠接口多個具體工廠實現類,每個工廠創建一個產品族
? 強調產品之間的 “族” 關系(如 Windows 風格的按鈕 + 復選框必須來自同一個工廠)。

// 抽象產品族
type Button interface { Click() }
type Checkbox interface { Check() }// 具體產品(按族分類)
type WindowsButton struct{}
type WindowsCheckbox struct{}
type MacButton struct{}
type MacCheckbox struct{}// 抽象工廠
type GUIFactory interface {CreateButton() ButtonCreateCheckbox() Checkbox
}// 具體工廠
type WindowsFactory struct{} // 創建Windows風格的Button和Checkbox
type MacFactory struct{}     // 創建Mac風格的Button和Checkbox

四、單例模式(Singleton Pattern)

定義:

確保一個類只有一個實例,并提供一個全局訪問點。

使用場景:

  • 配置管理類
  • 數據庫連接池
  • 日志處理類
  • 緩存管理器

特點:

  • 全局唯一
  • 延遲初始化(懶漢)
  • 線程安全

Go 語言實現(懶漢 + 線程安全):

package singletonimport ("sync"
)type Singleton struct {Name string
}var (instance *Singletononce     sync.Once
)func GetInstance() *Singleton {once.Do(func() {instance = &Singleton{Name: "唯一實例"}})return instance
}

單例模式確保某個類在整個系統中只有一個實例。常用 sync.Once 來實現線程安全的延遲初始化。在場景如日志記錄器、配置加載器中很常見。它的關鍵是將構造函數私有化,通過提供一個全局訪問方法來獲取實例。

餓漢

package singletontype EagerSingleton struct {Name string
}var eagerInstance = &EagerSingleton{Name: "餓漢式單例"}func GetEagerInstance() *EagerSingleton {return eagerInstance
}
  1. 懶漢式在第一次使用時才初始化,需要注意并發下的線程安全,Go 中推薦使用 sync.Once 來保證只初始化一次
  2. 餓漢式在程序啟動時就創建實例,線程安全但資源利用不夠高效。適合對資源敏感性不強的場景。
    實際開發中,推薦懶漢式 + sync.Once 方式來兼顧延遲加載和線程安全。

五、代理模式(Proxy Pattern)

定義:

為其他對象提供一個“代理”以控制對該對象的訪問。

使用場景:

  • 訪問控制(權限校驗)
  • 延遲加載(虛擬代理)
  • 遠程代理(RPC Stub)
  • 緩存代理(避免重復計算)

Go 語言實現(以下載器為例,帶緩存功能的代理):

package proxyimport "fmt"type Downloader interface {Download(url string)
}// 真實對象
type RealDownloader struct{}func (r *RealDownloader) Download(url string) {fmt.Println("正在下載:", url)
}// 代理對象
type ProxyDownloader struct {real     *RealDownloadercacheMap map[string]bool
}func NewProxyDownloader() *ProxyDownloader {return &ProxyDownloader{real:     &RealDownloader{},cacheMap: make(map[string]bool),}
}func (p *ProxyDownloader) Download(url string) {if p.cacheMap[url] {fmt.Println("緩存命中:", url)} else {p.real.Download(url)p.cacheMap[url] = true}
}

代理模式通過引入一個代理對象來控制對目標對象的訪問。比如在緩存代理中,代理會先判斷是否命中緩存,如果沒有才真正訪問目標對象。這樣可以在不改動原有邏輯的情況下,增強對象的功能(控制、緩存、權限等)。


https://github.com/0voice

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

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

相關文章

某標桿房企BI平臺2.0升級實踐

當房地產行業從“規模競賽”轉向“精益運營”,數字化轉型成為破局關鍵。某千億房企攜手億信華辰,以“用數據重構業務價值鏈”為目標,歷經6個月完成BI平臺戰略性升級。在這場從“數據可視化”到“決策智能化”的躍遷中,億信華辰ABI…

Lua 腳本在 Redis 中的運用-24 (使用 Lua 腳本實現原子計數器)

實踐練習:使用 Lua 腳本實現原子計數器 實現原子計數器是許多應用程序中的常見需求,例如跟蹤網站訪問量、限制 API 請求或管理庫存。雖然 Redis 提供了 INCR 命令用于遞增整數,但在復雜場景或與其他操作結合時直接使用它可能并不足夠。本課程探討了如何在 Redis 中利用 Lua…

Rust 學習筆記:使用迭代器改進 minigrep

Rust 學習筆記:使用迭代器改進 minigrep Rust 學習筆記:使用迭代器改進 minigrep不使用 clone,而使用迭代器使用迭代器適配器使代碼更清晰在循環或迭代器之間進行選擇 Rust 學習筆記:使用迭代器改進 minigrep 前情提要&#xff1…

el-table配置表頭固定而且高度變化

根據官網提示只要在 el-table 元素中定義了 height 屬性,即可實現固定表頭的表格,而不需要額外的代碼。 如果你想既要固定表頭,又要下方表格高度自適應,可以設置為 height"100%" : 然后外層設置scroll:

弱光環境下如何手持相機拍攝靜物:攝影曝光之等效曝光認知

寫在前面 博文內容為一次博物館靜物拍攝筆記的簡單總結內容涉及:弱光環境拍攝靜物如何選擇,以及等效曝光的認知理解不足小伙伴幫忙指正 😃,生活加油 我看遠山,遠山悲憫 持續分享技術干貨,感興趣小伙伴可以關注下 _ 采…

ARM筆記-ARM偽指令及編程基礎

第四章 ARM偽指令及編程基礎 4.1 偽指令概述 4.1.1 偽指令定義 人們設計了一些專門用于指導匯編器進行匯編工作的指令,由于這些指令不形成機器碼指令,它們只是在匯編器進行匯編工作的過程中起作用,所以被叫做偽指令。 4.1.2 偽指令特征 …

智能手表怎么申請歐盟EN 18031認證

智能手表申請歐盟 EN 18031 認證(針對消費類物聯網設備的網絡安全標準)的流程與智能門鎖類似,但需結合手表的功能特性(如數據交互、定位、支付等)調整合規重點。以下是具體流程和關鍵要點: 一、標準適配與…

算法-全排列

1、全排列函數的使用 舉例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

面試加分秘籍:校招數據傾斜場景下的SQL優化方案

校招面試經常會問大家有沒有過調優的經驗&#xff0c;相信大家的回答基本都是往數據傾斜和小文件問題這兩方面回答&#xff0c;對于數據傾斜相信大部分同學對熱key打散或null值引發的傾斜已經非常熟悉&#xff0c;但這些內容面試官也是聽膩了&#xff0c;希望大家在面試時候講一…

Elasticsearch索引機制與Lucene段合并策略深度解析

引言 在現代分布式搜索引擎Elasticsearch中&#xff0c;文檔的索引、更新和刪除操作不僅是用戶交互的核心入口&#xff0c;更是底層存儲架構設計的關鍵挑戰。本文圍繞以下核心鏈路展開&#xff1a; 文檔生命周期管理&#xff1a;從客戶端請求路由到分片定位&#xff0c;從內存…

git提交更改

第一步&#xff1a;添加改動 git add . 第二步&#xff1a;提交改動 git commit -m “替換了 SerialPort 庫文件” 第三步&#xff1a;推送到遠程 git push 為什么git 的UI界面做的遠不如SVN

WPF的基礎控件:布局控件(StackPanel DockPanel)

布局控件&#xff08;StackPanel & DockPanel&#xff09; 1 StackPanel的Orientation屬性2 DockPanel的LastChildFill3 嵌套布局示例4 性能優化建議5 常見問題排查 在WPF開發中&#xff0c;布局控件是構建用戶界面的基石。StackPanel和DockPanel作為兩種最基礎的布局容器&…

互聯網大廠Java求職面試:AI大模型推理服務性能優化與向量數據庫分布式檢索

互聯網大廠Java求職面試&#xff1a;AI大模型推理服務性能優化與向量數據庫分布式檢索 面試現場&#xff1a;技術總監的連環追問 技術總監&#xff1a;&#xff08;翻看著簡歷&#xff09;鄭薪苦&#xff0c;你在上一家公司參與過LLM推理服務的性能優化項目&#xff1f;說說你…

如何解決網站服務器的異常問題?

當網站服務器出現異常情況&#xff0c;導致用戶無法正常訪問網頁信息的時候&#xff0c;該如何解決這一問題呢&#xff1f;小編下面就帶領大家共同探討一下這一問題。 企業在面對網站服務器異常時&#xff0c;首先要對服務器硬件設備進行詳細的檢查&#xff0c;可以使用硬盤檢測…

Day 35

模型可視化與推理 知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化 進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀 推理的寫法&#xff1a;評估模式 模型結構可視化 理解一個深度學習網絡最重要的…

[yolov11改進系列]基于yolov11引入自注意力與卷積混合模塊ACmix提高FPS+檢測效率python源碼+訓練源碼

[ACmix的框架原理] 1.1 ACMix的基本原理 ACmix是一種混合模型&#xff0c;結合了自注意力機制和卷積運算的優勢。它的核心思想是&#xff0c;傳統卷積操作和自注意力模塊的大部分計算都可以通過1x1的卷積來實現。ACmix首先使用1x1卷積對輸入特征圖進行投影&#xff0c;生成一組…

[DS]使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼

使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼 摘要&#xff1a;由于 sample_data.csv 是一個占位符文件&#xff0c;用于代表任意數據集&#xff0c;我將使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼…

【Python 中 lambda、map、filter 和 reduce】詳細功能介紹及用法總結

以下是 Python 中 lambda、map、filter 和 reduce 的詳細功能介紹及用法總結&#xff0c;涵蓋基礎語法、高頻場景和示例代碼。 一、lambda 匿名函數 功能 用于快速定義一次性使用的匿名函數。不需要顯式命名&#xff0c;適合簡化小規模邏輯。 語法 lambda 參數1, 參數2, ..…

貪心算法——分數背包問題

一、背景介紹 給定&#x1d45b;個物品&#xff0c;第&#x1d456;個物品的重量為&#x1d464;&#x1d454;&#x1d461;[&#x1d456;?1]、價值為&#x1d463;&#x1d44e;&#x1d459;[&#x1d456;?1]&#xff0c;和一個容量為&#x1d450;&#x1d44e;&#…

《軟件工程》第 5 章 - 需求分析模型的表示

目錄 5.1需求分析與驗證 5.1.1 順序圖 5.1.2 通信圖 5.1.3 狀態圖 5.1.4 擴充機制 5.2 需求分析的過程模型 5.3 需求優先級分析 5.3.1 確定需求項優先級 5.3.2 排定用例分析的優先順序 5.4 用例分析 5.4.1 精化領域概念模型 5.4.2 設置分析類 5.4.3 構思分析類之間…