GO設計模式——3、抽象工廠模式(創建型)

目錄

抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式的核心角色

優缺點

代碼實現


抽象工廠模式(Abstract Factory Pattern)

????????抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。抽象工廠模式提供了一種創建一系列相關或相互依賴對象的接口,而無需指定具體實現類。通過使用抽象工廠模式,可以將客戶端與具體產品的創建過程解耦,使得客戶端可以通過工廠接口來創建一族產品。

????????抽象工廠模式基于工廠方法模式。兩者的區別在于:工廠方法模式是創建出一種產品,而抽象工廠模式是創建出一類產品。這二種都屬于工廠模式,在設計上是相似的。

抽象工廠模式的核心角色

???????1、抽象工廠(Abstract Factory):聲明了一組用于創建產品對象的方法,每個方法對應一種產品類型。抽象工廠可以是接口或抽象類。

????????2、具體工廠(Concrete Factory):實現了抽象工廠接口,負責創建具體產品對象的實例。

????????3、抽象產品(Abstract Product):定義了一組產品對象的共同接口或抽象類,描述了產品對象的公共方法。

????????4、具體產品(Concrete Product):實現了抽象產品接口,定義了具體產品的特定行為和屬性。

優缺點

(1)優點當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。

(2)缺點產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼

代碼實現

package mainimport "fmt"// (抽象工廠) 能夠生產tv、手機、Ipad
type AbstractFactory interface {CreateTelevision() TelevisionCreateIpad() IpadCreateCellphone() Cellphone
}// (抽象產品) -- Television
type Television interface {Watch()
}// (抽象產品) -- Ipad
type Ipad interface {Play()
}// (抽象產品) -- Cellphone
type Cellphone interface {Callphone()
}// (具體工廠) 華為工廠
type HuaweiFactory struct {
}func (hf *HuaweiFactory) CreateTelevision() Television {return &HuaweiTelevision{}
}
func (hf *HuaweiFactory) CreateIpad() Ipad {return &HuaweiIpad{}
}
func (hf *HuaweiFactory) CreateCellphone() Cellphone {return &HuaweiCellphone{}
}// (具體產品)華為Television,實現了Television接口
type HuaweiTelevision struct {
}func (hc *HuaweiTelevision) Watch() {fmt.Println("Watch Huawei Television")
}// (具體產品)華為Ipad,實現了Ipad接口
type HuaweiIpad struct {
}func (hc *HuaweiIpad) Play() {fmt.Println("Play Huawei Ipad")
}// (具體產品)華為Cellphone,實現了Cellphone接口
type HuaweiCellphone struct {
}func (hc *HuaweiCellphone) Callphone() {fmt.Println("Call Huawei Cellphone")
}// (具體工廠) 小米工廠
type MiFactory struct {
}func (mf *MiFactory) CreateTelevision() Television {return &MiTelevision{}
}
func (mf *MiFactory) CreateIpad() Ipad {return nil
}
func (mf *MiFactory) CreateCellphone() Cellphone {return &MiCellphone{}
}// (具體產品)小米Television,實現了Television接口
type MiTelevision struct {
}func (mt *MiTelevision) Watch() {fmt.Println("Watch Mi Television")
}// (具體產品)小米Cellphone,實現了Cellphone接口
type MiCellphone struct {
}func (mc *MiCellphone) Callphone() {fmt.Println("Call Mi Cellphone")
}// 超級工廠類 獲取超級工廠實例
type HyperFactory struct {
}func (hf *HyperFactory) CreateFactory(factoryName string) AbstractFactory {switch factoryName {case "Huawei":return &HuaweiFactory{}case "Mi":return &MiFactory{}default:return nil}
}func main() {hfactoey := HyperFactory{}hwfactory := hfactoey.CreateFactory("Huawei")hwfactory.CreateTelevision().Watch()hwfactory.CreateIpad().Play()hwfactory.CreateCellphone().Callphone()mifactory := hfactoey.CreateFactory("Mi")mifactory.CreateTelevision().Watch()if mifactory.CreateIpad() == nil {fmt.Println("不支持")}mifactory.CreateCellphone().Callphone()
}

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

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

相關文章

單詞倒排

對字符串中的所有單詞進行倒排。 說明: 1、構成單詞的字符只有26個大寫或小寫英文字母; 2、非構成單詞的字符均視為單詞間隔符; 3、要求倒排后的單詞間隔符以一個空格表示;如果原字符串中相鄰單詞間有多個間隔符時,倒排…

yolo目標檢測+目標跟蹤+車輛計數+車輛分割+車道線變更檢測+速度估計

這個項目使用YOLO進行車輛檢測,使用SORT(簡單在線實時跟蹤器)進行車輛跟蹤。該項目實現了以下任務: 車輛計數車道分割車道變更檢測速度估計將所有這些詳細信息轉儲到CSV文件中 車輛計數是指在道路上安裝相應設備,通過…

windows下 Tomcat啟動黑框隱藏

進入到 tomcat/bin 目錄下,找到此文件 setclasspath.bat ,右鍵文本打開 找到此屬性 : set _RUNJAVA"%JRE_HOME%\bin\java.exe"修改成以下屬性,保存文件,重啟啟動tomcat會發現黑框不默認彈出了: …

使用hutool工具生成非對稱加密公私密鑰以及使用案例

1.導入hutool依賴 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.18</version></dependency>2.直接復制代碼 package com.common.utils;import cn.hutool.core.codec.Base64; i…

僅需30秒完美復刻任何人的聲音 - 最強AI音頻11Labs

我的用詞一直都挺克制的&#xff0c;基本不會用到“最強”這個字眼。 但是這一次的這個AI應用&#xff0c;是我認為在TTS&#xff08;文字轉音頻&#xff09;這個領域&#xff0c;當之無愧的“最強”。 ElevenLabs&#xff0c;簡稱11Labs。 僅需30秒到5分鐘左右的極少的數據集…

機器學習-分類問題

前言 《機器學習-回歸問題》知道了回歸問題的處理方式,分類問題才是機器學習的重點.從數據角度講,回歸問題可以轉換為分類問題的微分 邏輯回歸 邏輯回歸&#xff08;Logistics Regression&#xff09;,邏輯回歸雖然帶有回歸字樣&#xff0c;但是邏輯回歸屬于分類算法。但只可…

極大提升GPT-4等模型推理效率,微軟、清華開源全新框架

隨著用戶需求的增多&#xff0c;GPT-4、Claude等模型在文本生成、理解、總結等方面的能力越來越優秀。但推理的效率并不高&#xff0c;因為&#xff0c;多數主流模型采用的是“順序生成詞”方法&#xff0c;會導致GPU利用率很低并帶來高延遲。 為了解決這一難題&#xff0c;清…

美國Linux服務器的iptables防火墻介紹

美國Linux服務器防火墻一般分為硬件防火墻和軟件防火墻&#xff0c;但不論是硬件防火墻還是軟件防火墻&#xff0c;都需要通過使用硬件作為聯機的介質&#xff0c;也需要使用軟件來設定美國Linux服務器安全政策&#xff0c;因此可以從使用的硬件與操作系統來加以區分。硬件防火…

oracle怎么推進scn?

很多時候&#xff0c;數據庫有故障打不開&#xff0c;需要用到推進scn的技術&#xff0c;這里介紹下12c及以上版本的oracle怎么推進數據庫的scn。 經測試發現&#xff0c;數據庫mount和open狀態下都可以通過此方法推進SCN。 Session1&#xff1a; 查詢當前SCN SQL> select c…

基于jsp+servlet的圖書管理系統

基于jspservlet的圖書管理系統演示地址為 圖書館后臺管理系統 用戶名:mr ,密碼:123 圖書館管理系統主要的目的是實現圖書館的信息化管理。圖書館的主要業務就是新書的借閱和歸還&#xff0c; 因此系統最核心的功能便是實現圖書的借閱和歸還。此外&#xff0c;還需要提供圖書…

Stable Diffusion XL on diffusers

Stable Diffusion XL on diffusers 翻譯自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/sdxl v0.24.0 非逐字翻譯 Stable Diffusion XL (SDXL) 是一個強大的圖像生成模型&#xff0c;其在上一代 Stable Diffusion 的基礎上主要做了如下優化&#xff1a;…

生產上線需要注意的安全漏洞

一、關閉swagger 1、關閉swagger v3 # 需同時設置auto-startupfalse&#xff0c;否則/v3/api-docs等接口仍能繼續訪問 springfox:documentation:enabled: falseauto-startup: falseswagger-ui:enabled: false 2、關閉swagger v2 # 只要不是true就不啟用 swagger:enable: fa…

深度解讀:淘客返利機器人無限制與免費版的差異

深度解讀:淘客返利機器人無限制與免費版的差異 在數字時代&#xff0c;人工智能和大數據技術的飛速發展正在改變我們的生活方式&#xff0c;尤其在購物領域&#xff0c;各種優惠工具如雨后春筍般涌現。其中&#xff0c;淘客返利機器人和微賺淘客系統以其獨特的優勢&#xff0c…

Python核心編程之序列下篇

目錄 十二、列表 如何創建列表類型數據并給它賦值 如何訪問列表中的值

代立冬:基于Apache Doris+SeaTunnel 實現多源實時數據倉庫解決方案探索實踐

大家好&#xff0c;我是白鯨開源的聯合創始人代立冬&#xff0c;同時擔任 Apache DolphinScheduler 的 PMC chair 和 SeaTunnel 的 PMC。作為 Apache Foundation 的成員和孵化器導師&#xff0c;我積極參與推動多個開源項目的發展&#xff0c;幫助它們通過孵化器成長為 Apache …

如何訪問內部網絡做內網穿透

項目&#xff1a;https://github.com/ehang-io/nps 有個公網服務器&#xff0c;搭建服務端。 然后客戶端使用&#xff1a; -server是服務端的訪問方式。-vkey是秘鑰。 ./npc -server192.227.19.12:8024 -vkeyoies8gq3wml -typetcp然后在服務端配置TCP隧道即可。

某度旋轉驗證碼v2 逆向分析

v2主要依據是核心 JS 文件mkd_v2.js 版本&#xff0c;如下圖所示&#xff1a; 第一次 https://passport.baidu.com/cap/init 接口&#xff0c;請求的 ak 是固定值&#xff0c;當然不同場景不同網站是不一樣的&#xff0c;_ 時間戳&#xff0c;ver1&#xff0c;返回值 as、tk 都…

大數據的技術棧-逐步完善

目錄 1.hadoop a.HDFS分布式文件系統 b.Yarn集群資源管理器 c.MapReduce sql引擎 d.Impala sql引擎 e.工具概觀 2.數據倉庫知識 a.Hive數據庫 1)Hive Sql 2)數據庫結構 b.Doris數據庫 3.混合處理框架SPARK a.Spark b.集群架構 4.數倉模型知識 5.開發工具 a.Dbeaver b.Idea…

android項目實戰之使用框架 集成多圖片、視頻的上傳

效果圖 實現方式&#xff0c;本功能使用PictureSelector 第三方庫 。作者項目地址&#xff1a;https://github.com/LuckSiege/PictureSelector 1. builder.gradle 增加 implementation io.github.lucksiege:pictureselector:v3.11.1implementation com.tbruyelle.rxpermissio…

線性回歸實戰

3.1 使用正規方程進行求解 3.1.1 簡單線性回歸 公式 &#xff1a; y w x b y wx b ywxb 一元一次方程&#xff0c;在機器學習中一元表示一個特征&#xff0c;b表示截距&#xff0c;y表示目標值。 使用代碼進行實現&#xff1a; 導入包 import numpy as np import matp…