Go語言設計模式(三)抽象工廠模式

抽象工廠模式與工廠模式類似,被認為是工廠方法模式的另一層抽象.抽象工廠模式圍繞創建其他工廠的超級工廠工作.

1.角色:

1.1抽象產品:

構成產品系列的一組不同但相關的產品的聲明接口.

1.2具體產品:

實現抽象產品接口的類,主要用于定義產品對象,由相應的具體工廠創建.

1.3抽象工廠:

創建抽象產品對象的操作接口.

1.4具體工廠:

實現抽象工廠接口的類.用于創建產品對象.每個具體工廠都會生產相應的具體產品.

1.5客戶端:

通過抽象接口調用抽象工廠對象和抽象產品對象,客戶端能與所有具體工廠或具體產品交互.

2.抽象工廠使用場景:

2.1出于對代碼未來擴展性考慮.不希望代碼基于具體產品進行構建,可以使用抽象工廠模式.

2.2某個類具有一組抽象方法,并且這個類功能不夠明確,可以考慮抽象工廠模式.

2.3如果一個類需要與多種類型的產品交互,可以考慮將工廠方法抽取到具備完整功能的抽象工廠接口中.

3.實現方式:

3.1抽象產品接口:
package itboStudyimport "fmt"// 抽象產品接口
type AbstractProduct interface {GetName() 
}// 具體產品類
type Computer struct {
}//具體產品類中的方法
func (c *Computer) GetName() {fmt.Println("具體產品Computer")
}
3.2抽象工廠接口:
//抽象工廠接口
type AbstractFactory interface {CreateProduct() AbstractProduct
}
3.3具體工廠類及方法:
// 具體工廠類
type ComputerProductFactory struct{}// 初始化具體工廠對象.
func NewComputerProductFactory() ComputerProductFactory {return ComputerProductFactory{}
}// 使用具體工廠對象創建具體產品
func (com *ComputerProductFactory) CreateProduct() Computer {return Computer{}
}
3.4客戶端:
func main() {factory := itboStudy.NewComputerProductFactory()product := factory.CreateProduct()product.GetName()
}

4.實戰:

4.1抽象接口:
// 電子產品工廠
type InterfaceElectronicFactory interface {MakeComputer() InterfaceComputer
}// 獲取電子產品工廠對象
func GetElectronicFactory(brand string) (*LenovoFactory, error) {if brand == "電腦" {return &LenovoFactory{}, nil}return nil, fmt.Errorf("%s", "error brand type")
}
4.2具體工廠類:
// 定義具體工廠類
type LenovoFactory struct{}// 生成聯想電腦
func (com *LenovoFactory) MakeComputer() *LenovoComputer {return &LenovoComputer{Computer: Computer{color: "black",size:  14,},}
}
4.3抽象產品接口:
type InterfaceComputer interface {SetColor(color string)SetSize(size int)Getcolor() stringGetsize() int
}type Computer struct {color stringsize  int
}func (com *Computer) SetColor(color string) {com.color = color
}func (com *Computer) SetSize(size int) {com.size = size
}func (com *Computer) GetSize() int {return com.size
}func (com *Computer) GetColor() string {return com.color
}
4.4具體產品類:
// 定義具體產品
type LenovoComputer struct {Computer
}
4.5客戶端:
func main() {factory, _ := itboStudy.GetElectronicFactory("電腦")computer := factory.MakeComputer()fmt.Printf("computer:%#v\n", computer.GetColor())
}

5優點:

客戶端不知道創建什么類型對象時.

抽象工廠實現了具體的隔離.

抽象工廠可以輕松改變產品系列.

保證產品一致性.

6.缺點:

抽象工廠難以擴展新型產品.如果要支持新型產品需要擴展工廠接口.

可以遲到,但是不會缺席.

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

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

相關文章

大狗王 DG1+ 13.6G礦機詳細參數解析與性能評測

近年來,隨著加密貨幣挖礦行業的不斷發展,越來越多的礦機廠商推出了高性能、低功耗的礦機設備。大狗王(DG1)13.6G礦機便是其中一款備受關注的設備,特別是在LTC(萊特幣)、Doge(狗狗幣&…

Python 算術運算練習題

計算數字特征值題目描述 編寫一個程序,接收用戶輸入的兩個整數 a 和 b(a > b > 0),計算并輸出以下結果:a 與 b 的和的平方a 除以 b 的商和余數a 與 b 的平均數(保留 2 位小數)示例請輸入整…

OS項目構建效能改進策劃方案

一、現狀分析與問題定位構建穩定性問題: 表現:非代碼變更引發的構建失敗(如環境依賴、工具鏈版本、第三方庫更新、資源競爭等)“幽靈構建”時有發生。影響:嚴重破壞開發流程的順暢性,耗費大量開發/測試人員…

Ai8051 2.4寸320*240 ILI9341 I8080接口驅動

/*---------------------------------------------------------------------*/ /* --- Web: www.STCAI.com ---------------------------------------------*/ /* 液晶屏驅動程序參考wiki技術網站提供的開源源碼,僅供學習使用 */ /*----------------------…

最大似然估計:損失函數的底層數學原理

引言當你第一次看到線性回歸時,你是否注意到了作為參數優化關鍵的損失函數(均方損失),你是否能夠理解它的本質和由來。其實,在我第一次接觸時,我是感到有些驚訝的,然后試著去強行理解它&#xf…

使用 n8n 結合通義千問大模型構建業務數據庫分析智能體

一、項目概述 本項目致力于構建一個結合 n8n 工作流引擎 與 通義千問大模型 的智能體,旨在對龐大的業務數據庫進行自動化分析、語義建模及自然語言問答。通過不同工作流的迭代構建,實現了表結構解析、業務含義提取、關系可視化、問答服務等能力&#xff…

css margin外邊距重疊/塌陷問題

一、定義 相鄰塊級元素或父子元素的垂直外邊距會合并&#xff08;折疊&#xff09;為單個邊距&#xff0c;其大小為單個邊距的最大值&#xff08;或如果他們相等&#xff0c;則僅為其中的一個&#xff09;&#xff0c;這種行為稱為邊距折疊 <div style"margin-bottom: …

可重復讀 是否“100%”地解決幻讀?

這是一個非常深刻的問題&#xff0c;答案是&#xff1a;幾乎解決了&#xff0c;但在一個非常特殊且罕見的邊界場景下&#xff0c;理論上仍然可能出現幻讀。 因此&#xff0c;嚴格來說&#xff0c;它并非被“徹底”或“100%”地解決。下面我們來詳細分解這個結論&#xff1a;1. …

從零開始的云計算生活——第五十八天,全力以赴,Jenkins部署

目錄 一.故事背景 二.安裝Jenkins必要插件 1.安裝Publish Over SSH 2.安裝maven integration插件 3. 配置jenkins并發執行數量 4. 配置郵件地址 三. 基于Jenkins部署PHP環境 1. 下載ansible插件 2. 下載ansible應用 3. 構建項目 ?編輯 使用Jenkins賬戶生成ssh密鑰 …

串口HAL庫發送問題

想了很久&#xff0c;不知道該標題起的是否合適&#xff0c;該篇Blog用于記錄在使用HAL庫的USART模塊時實際遇到的一個涉及發送方式的問題&#xff0c;用于提醒自身同時也希望能幫到各位。程序問題敘述先來看一段代碼&#xff1a;void CusUSART_SendByte_IT( uint8_t Byte ) { …

CUDA默認流的同步行為

默認流 對于需要指定 cudaStream_t參數的 cuda API&#xff0c;如果將 0作為實參傳入&#xff0c;則視為使用默認流&#xff1b;對于不需要指定 cudaStream_t參數的 cuda API&#xff0c;則也視為使用默認流。 在 cuda中&#xff0c;默認流有兩種類型&#xff0c;一種是 legacy…

「數據獲取」《中國電力統計年鑒》(1993-2024)(含中國電力年鑒)

01、數據簡介一、《中國電力統計年鑒》作為全面系統反映中國電力領域發展狀況的權威性年度統計資料&#xff0c;涵蓋了電力建設、生產、消費及供需等全鏈條關鍵信息。其編制工作有著深厚的歷史積淀&#xff0c;可追溯至 20 世紀 50 年代&#xff0c;歷經數十年的積累與完善&…

《AI大模型應知應會100篇》第68篇:移動應用中的大模型功能開發 —— 用 React Native 打造你的語音筆記摘要 App

&#x1f4f1; 第68篇&#xff1a;移動應用中的大模型功能開發 —— 用 React Native 打造你的語音筆記摘要 App &#x1f3af; 核心目標&#xff1a;零門檻集成大模型&#xff0c;5步開發跨平臺智能功能 &#x1f9e9; 適用人群&#xff1a;前端開發者、產品經理、獨立開發者 …

FPGA ad9248驅動

ad9248的最高時鐘頻率65mhz&#xff0c;采用cmos3.3v電壓的并行io接口&#xff0c;做成電子模塊后一般為雙通道adc&#xff0c;有兩個對外輸出時鐘cha_clk與chb_clk&#xff0c;一個并行輸入端口&#xff0c;14分辨率的ddr_data&#xff0c;其模塊邏輯如下&#xff0c;首先向ad…

Spring MVC 處理請求的流程

Spring MVC 處理請求的流程流程步驟詳解第1步&#xff1a;發起請求 (HTTP Request)第2步&#xff1a;映射處理器 (Handler Mapping)第3步&#xff1a;獲取適配器 (Handler Adapter)第4步&#xff1a;執行攔截器前置處理 (Interceptors - preHandle)第5步&#xff1a;真正調用處…

敏捷scrum管理實戰經驗總結

1.敏捷 敏捷的構成 敏捷由實踐來源、應用場景、組織文化、領導力、團隊、需求、管理、技術、質量、度量、交付、過程改進、大型項目組合管理以及受監管行業中的敏捷等構成 敏捷開發的特點 短發布周期小批量的方式、開展從需求到實現的開發工作高層級的預先規劃結合詳細的即時規…

南科大適應、協同與規劃的完美融合!P3:邁向多功能的具身智能體

作者&#xff1a;Shengli Zhou1^{1}1, Xiangchen Wang1^{1}1, Jinrui Zhang1^{1}1, Ruozai Tian2^{2}2, Rongtao Xu2,3^{2,3}2,3, Feng Zheng1,2^{1,2}1,2單位&#xff1a;1^{1}1南方科技大學&#xff0c;2^{2}2時空智能&#xff0c;3^{3}3穆罕默德本扎耶德人工智能大學論文標題…

自動化流水線

import React, { useState, useEffect } from ‘react’; import { ChevronRight, CheckCircle, Circle, AlertCircle, Clock, Play, Pause, Settings, Code, Server, Shield, Database, Globe, Zap, FileText, Users, GitBranch, Package, Monitor, ChevronDown } from ‘luci…

【高等數學】第十一章 曲線積分與曲面積分——第三節 格林公式及其應用

上一節&#xff1a;【高等數學】第十一章 曲線積分與曲面積分——第二節 對坐標的曲線積分 總目錄&#xff1a;【高等數學】 目錄 文章目錄1. 格林公式2. 平面上曲線積分與路徑無關的條件3. 二元函數的全微分求積4. 曲線積分的基本定理1. 格林公式 單連通與復連通區域 設 DDD …

Boost電路:平均狀態空間建模

電路特征介紹如圖所示是一個非理想情況下的boost電路&#xff0c;其中L1L_{1}L1?和RL1R_{L1}RL1?是分別是電感和串聯電阻&#xff1b;C1C_{1}C1?和RC1R_{C1}RC1?是輸出電容和串聯電阻&#xff1b;Q1Q_{1}Q1?是MOS管&#xff0c;其導通電阻是RonR_{on}Ron?&#xff1b;D1D…