隨筆背景
某一天詢問某大牛--賀某人。詢問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())
}
整體效果如下: