golang 工廠模式


隨筆背景

某一天詢問某大牛--賀某人。詢問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())
}

整體效果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM