工廠模式
1. 什么是工廠模式
Factory Pattern辛掠,屬于創(chuàng)建型模式,它不會(huì)對(duì)用戶(hù)暴露創(chuàng)建的邏輯他宛。而是使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象欠气。
2. 工廠模式解決了什么問(wèn)題
解決了接口的選擇問(wèn)題,我們現(xiàn)在只需要知道要獲取的類(lèi)名稱(chēng)宜鸯,然后從工廠中直接獲取就可以。在生成復(fù)雜對(duì)象時(shí)鸿市,可以使用工廠模式即碗,這樣用戶(hù)就不必理解復(fù)雜對(duì)象的創(chuàng)建過(guò)程,只需要獲取對(duì)象剥懒,并使用即可。
2.1 工廠模式優(yōu)點(diǎn)
- 簡(jiǎn)化獲取對(duì)象流程验游,當(dāng)我們想要獲取一個(gè)對(duì)象時(shí)保檐,只需要知道對(duì)象的名稱(chēng),直接從工廠中獲取就行夜只。
- 擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品盐肃,只要擴(kuò)展一個(gè)工廠類(lèi)就可以了权悟。
- 屏蔽了產(chǎn)品的具體實(shí)現(xiàn)推盛,調(diào)用者只關(guān)心接口就行。
2.2 工廠模式缺點(diǎn)
- 每增加一個(gè)產(chǎn)品時(shí)榔昔,都需要增加一個(gè)具體類(lèi)和對(duì)象實(shí)現(xiàn)工廠瘪菌,使得系統(tǒng)中的類(lèi)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度师妙。
3. 工廠模式的實(shí)現(xiàn)
3.1 創(chuàng)建一個(gè)模型接口
這個(gè)接口有一個(gè)Draw方法,所有的模型類(lèi)都會(huì)實(shí)現(xiàn)這一個(gè)方法怔檩。
//Shape 模型接口
type Shape interface {
Draw()
}
3.2 創(chuàng)建三個(gè)模型類(lèi)
這三個(gè)模型類(lèi)實(shí)現(xiàn)了Shape的接口蓄诽,我們用一個(gè)工廠,將其創(chuàng)建過(guò)程封裝在工廠中仑氛。
//Circle 圓形類(lèi)
type Circle struct{}
//Square 正方形類(lèi)
type Square struct{}
//Rectangle 矩形類(lèi)
type Rectangle struct{}
圓形類(lèi)的方法實(shí)現(xiàn):
//NewCircle 實(shí)例化Circle類(lèi)
func NewCircle() *Circle {
return &Circle{}
}
//Draw Circle實(shí)現(xiàn)Shape接口的Draw方法
func (c *Circle) Draw() {
fmt.Println("Circle Draw() method.")
}
3.3 創(chuàng)建模型工廠
//ShapeFactory 模型工廠類(lèi)
type ShapeFactory struct{}
//NewShapeFactory 實(shí)例化模型工廠
func NewShapeFactory() *ShapeFactory {
return &ShapeFactory{}
}
//GetShape 從模型工廠獲取指定的模型類(lèi)
func (sf *ShapeFactory) GetShape(shapeType string) Shape {
switch shapeType {
case "circle":
return NewCircle()
case "square":
return NewSquare()
case "rectangle":
return NewRectangle()
default:
return nil
}
}
在模型工廠中GetShape(shapeType string) Shape
函數(shù)可以通過(guò)模型的名稱(chēng)锯岖,獲取具體的模型類(lèi)。因?yàn)樗械哪P皖?lèi)都實(shí)現(xiàn)了Shape接口的Draw方法嚎莉,所以他們都可以作為Shape類(lèi)型來(lái)賦值沛豌。