golang實(shí)現(xiàn)簡(jiǎn)單工廠、方法工廠、抽象工廠三種設(shè)計(jì)模式
1、簡(jiǎn)單工廠:
第一步:創(chuàng)建一個(gè)文章接口,需要實(shí)現(xiàn)閱讀和寫作的功能。
type Article interface {
ReadArticle() string
WriteArticle(contents string) string
}第二步:創(chuàng)建 中文書(shū) 和 英文書(shū) 兩個(gè)“類”,并且分別實(shí)現(xiàn)兩種方法。(注:golang種沒(méi)有類,只有組合。應(yīng)賀總強(qiáng)調(diào),特別說(shuō)明)
type ChineseArticle struct{}
type EnglishArticle struct{}
func (c *ChineseArticle) ReadArticle() string {
return "這是中文字符"
}
func (c *EnglishArticle) ReadArticle() string {
return "this's English chars"
}
func (c *ChineseArticle) WriteArticle(contents string) string {
return "寫入了文章"
}
func (c *EnglishArticle) WriteArticle(contents string) string {
return "wirted words"
}第三步:使用斷言方式分配不同的參數(shù),應(yīng)該需要使用什么樣的方法去實(shí)例化具體的類
func SFactory(lan string) (art Article) {
switch lan {
case "Chinese":
art = &ChineseArticle{}
case "English":
art = &EnglishArticle{}
default:
art = &ChineseArticle{}
}
return art
}第四步:使用
func main() {
a := SFactory("Chinese")//這樣,我實(shí)例化中文書(shū)還是英文書(shū)都可以了
fmt.Println(a.ReadArticle())
}總體結(jié)構(gòu)如下圖:

2、方法工廠:
第一步:同上, 來(lái)一個(gè)文章接口
type Article interface {
ReadArticle() string
WriteArticle(contents string) string
}第二步:來(lái)兩種書(shū)。需要實(shí)例化的類。并且實(shí)現(xiàn)接口
type ChineseArticle struct{}
type EnglishArticle struct{}
//實(shí)現(xiàn)讀寫接口
func (c *ChineseArticle) ReadArticle() string {
return "讀書(shū)了"
}
func (c *EnglishArticle) ReadArticle() string {
return "reading books"
}
func (c *ChineseArticle) WriteArticle(contents string) string {
return "寫書(shū)了"
}
func (c *EnglishArticle) WriteArticle(contents string) string {
return "wirting books"
}第三步:創(chuàng)建兩個(gè)用來(lái)創(chuàng)建“類”的“類”,以及其方法
type CreateEnglish struct{}
type CreateChinese struct{}
//方法工廠的核心。
func (cdb *CreateEnglish) CreateArticle() (len *EnglishArticle, err error) {
len = &EnglishArticle{}
return len, nil
}
func (cdb *CreateChinese) CreateArticle() (len *ChineseArticle, err error) {
len = &ChineseArticle{}
return len, nil
}第四步:使用
func main() {
a := &CreateChinese{}
art, _ := a.CreateArticle()
fmt.Println(art.WriteArticle("123"))
}總體結(jié)構(gòu)如下:

抽象工廠
第一步:創(chuàng)建一個(gè)book,然后再創(chuàng)建一個(gè)能夠創(chuàng)建book的BookCompany接口。
type BookCompany interface {
Create() Book
}
type Book interface {
ReadBook() string
WriteBook() string
}第二步:創(chuàng)建兩book 并且實(shí)現(xiàn)它
type EnglishBook struct{}
type ChineseBook struct{}
//實(shí)現(xiàn)book的功能
func (c *EnglishBook) ReadBook() string {
return "reading a english book"
}
func (c *ChineseBook) ReadBook() string {
return "讀中文書(shū)"
}
func (c *EnglishBook) WriteBook() string {
return "i'am writing"
}
func (c *ChineseBook) WriteBook() string {
return "我在創(chuàng)作中"
}第三步:創(chuàng)建兩個(gè)印刷廠
type BeiJinCompany struct{}
type ShanghaiCompany struct{}
//一個(gè)印刷場(chǎng)刷英語(yǔ)書(shū),一個(gè)刷中文書(shū)
func (c *BeiJinCompany) Create() Book {
return &EnglishBook{}
}
func (c *ShanghaiCompany) Create() Book {
return &ChineseBook{}
}第四步:用起來(lái)
func main() {
var f BookCompany
f = new(BeiJinCompany)
book := f.Create()
fmt.Println(book.ReadBook())
}整體效果如下:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringEvent優(yōu)雅解耦時(shí)連續(xù)兩個(gè)bug的解決方案
這篇文章主要為大家介紹了SpringEvent優(yōu)雅解耦時(shí)連續(xù)兩個(gè)bug的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
淺析go中的map數(shù)據(jù)結(jié)構(gòu)字典
golang中的map是一種數(shù)據(jù)類型,將鍵與值綁定到一起,底層是用哈希表實(shí)現(xiàn)的,可以快速的通過(guò)鍵找到對(duì)應(yīng)的值。這篇文章主要介紹了go中的數(shù)據(jù)結(jié)構(gòu)字典-map,需要的朋友可以參考下2019-11-11
通過(guò)案例簡(jiǎn)單聊聊為什么說(shuō)Go中的字符串是不能被修改的
在接觸Go這么語(yǔ)言,可能你經(jīng)常會(huì)聽(tīng)到這樣一句話,對(duì)于字符串不能修改,可能你很納悶,日常開(kāi)發(fā)中我們對(duì)字符串進(jìn)行修改也是很正常的,為什么又說(shuō)Go中的字符串不能進(jìn)行修改呢,本文就來(lái)通過(guò)實(shí)際案例給大家演示,為什么Go中的字符串不能進(jìn)行修改2023-07-07
在ubuntu下安裝go開(kāi)發(fā)環(huán)境的全過(guò)程
Go語(yǔ)言是谷歌公司開(kāi)發(fā)的編程語(yǔ)言,雖然安裝和配置go很簡(jiǎn)單,但是很多初學(xué)者在第一次安裝go環(huán)境時(shí)會(huì)遇到各種坑,下面這篇文章主要給大家介紹了關(guān)于在ubuntu下安裝go開(kāi)發(fā)環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
GoZero實(shí)現(xiàn)數(shù)據(jù)庫(kù)MySQL單例模式連接的簡(jiǎn)單示例
在 GoZero 框架中實(shí)現(xiàn)數(shù)據(jù)庫(kù)的單例連接可以通過(guò)以下步驟來(lái)完成,GoZero 使用 gorm 作為默認(rèn)的數(shù)據(jù)庫(kù)操作框架,接下來(lái)我會(huì)展示一個(gè)簡(jiǎn)單的單例模式實(shí)現(xiàn),需要的朋友可以參考下2025-02-02
GoLang的sync.WaitGroup與sync.Once簡(jiǎn)單使用講解
sync.WaitGroup類型,它比通道更加適合實(shí)現(xiàn)這種一對(duì)多的goroutine協(xié)作流程。WaitGroup是開(kāi)箱即用的,也是并發(fā)安全的。同時(shí),與之前提到的同步工具一樣,它一旦被真正的使用就不能被復(fù)制了2023-01-01
Go語(yǔ)言開(kāi)發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放
這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放的過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

