golang 工廠模式

李慢慢233發表於2022-04-08

隨筆背景

某一天詢問某大牛--賀某人。詢問golang為啥沒有建構函式。他給我的回覆就是,為啥要有建構函式,給爺爺我寫清楚點,不要啥都寫隱式標識!!把我一頓懟!(注:不用擔心,我被懟很有經驗。)然後我就亮出了我的王牌我知道你揹著你老婆看小姐姐的證據” (注:他老婆也是好朋友,本人善於告狀!)。被逼無奈之下,告訴了我別的方法。如圖:

仔細一想:這他媽不是工廠模式,初始化版V1.0嗎?

於實抱著學習的態度用golang實現一下簡單工廠方法工廠抽象工廠三種設計模式。

1、簡單工廠:

第一步:建立一個文章介面,需要實現閱讀和寫作的功能。

type Article interface {
	ReadArticle() string
	WriteArticle(contents string) string
}

第二步:建立 中文書英文書 兩個“類”,並且分別實現兩種方法。(注:golang種沒有類,只有組合。應賀總強調,特別說明)

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"
}

第三步:使用斷言方式分配不同的引數,應該需要使用什麼樣的方法去例項化具體的類

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")//這樣,我例項化中文書還是英文書都可以了
	fmt.Println(a.ReadArticle())
}

總體結構如下圖:

2、方法工廠:

第一步:同上, 來一個文章介面

type Article interface {
	ReadArticle() string
	WriteArticle(contents string) string
}

第二步:來兩種書。需要例項化的類。並且實現介面

type ChineseArticle struct{}
type EnglishArticle struct{}
//實現讀寫介面
func (c *ChineseArticle) ReadArticle() string {
	return "讀書了"
}
func (c *EnglishArticle) ReadArticle() string {
	return "reading books"
}
func (c *ChineseArticle) WriteArticle(contents string) string {
	return "寫書了"
}
func (c *EnglishArticle) WriteArticle(contents string) string {
	return "wirting books"
}

第三步:建立兩個用來建立“類”的“類”,以及其方法

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"))
}

總體結構如下:

抽象工廠

第一步:建立一個book,然後再建立一個能夠建立book的BookCompany介面。

type BookCompany interface {
	Create() Book
}
type Book interface {
	ReadBook() string
	WriteBook() string
}

第二步:建立兩book 並且實現它

type EnglishBook struct{}
type ChineseBook struct{}
//實現book的功能
func (c *EnglishBook) ReadBook() string {
	return "reading a english book"
}
func (c *ChineseBook) ReadBook() string {
	return "讀中文書"
}
func (c *EnglishBook) WriteBook() string {
	return "i'am writing"
}
func (c *ChineseBook) WriteBook() string {
	return "我在創作中"
}

第三步:建立兩個印刷廠

type BeiJinCompany struct{}
type ShanghaiCompany struct{}
//一個印刷場刷英語書,一個刷中文書
func (c *BeiJinCompany) Create() Book {
	return &EnglishBook{}
}
func (c *ShanghaiCompany) Create() Book {
	return &ChineseBook{}
}

第四步:用起來

func main() {
	var f BookCompany
	f = new(BeiJinCompany)
	book := f.Create()
	fmt.Println(book.ReadBook())
}

整體效果如下:

相關文章