意圖:
定義一個建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行
主要解決介面選擇問題
關鍵程式碼:
返回的例項都實現同一介面
應用例項:
- 您需要一輛汽車,可以直接從工廠裡面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裡面的具體實現。
- Hibernate 換資料庫只需換方言和驅動就可以。
Go實現工廠模式
1. 簡單工廠模式
package simple
import "fmt"
// 簡單工廠模式
type Girl interface {
weight()
}
// 胖女孩
type FatGirl struct {
}
func (FatGirl) weight() {
fmt.Println("80kg")
}
// 瘦女孩
type ThinGirl struct {
}
func (ThinGirl) weight() {
fmt.Println("50kg")
}
type GirlFactory struct {
}
func (*GirlFactory) CreateGirl(like string) Girl {
if like == "fat" {
return &FatGirl{}
} else if like == "thin" {
return &ThinGirl{}
}
return nil
}
2. 抽象工廠模式
package abstract
import (
"fmt"
)
// 抽象工廠模式
type Girl interface {
weight()
}
// 中國胖女孩
type FatGirl struct {
}
func (FatGirl) weight() {
fmt.Println("chinese girl weight: 80kg")
}
// 瘦女孩
type ThinGirl struct {
}
func (ThinGirl) weight() {
fmt.Println("chinese girl weight: 50kg")
}
type Factory interface {
CreateGirl(like string) Girl
}
// 中國工廠
type ChineseGirlFactory struct {
}
func (ChineseGirlFactory) CreateGirl(like string) Girl {
if like == "fat" {
return &FatGirl{}
} else if like == "thin" {
return &ThinGirl{}
}
return nil
}
// 美國工廠
type AmericanGirlFactory struct {
}
func (AmericanGirlFactory) CreateGirl(like string) Girl {
if like == "fat" {
return &AmericanFatGirl{}
} else if like == "thin" {
return &AmericanThainGirl{}
}
return nil
}
// 美國胖女孩
type AmericanFatGirl struct {
}
func (AmericanFatGirl) weight() {
fmt.Println("American weight: 80kg")
}
// 美國瘦女孩
type AmericanThainGirl struct {
}
func (AmericanThainGirl) weight() {
fmt.Println("American weight: 50kg")
}
// 工廠提供者
type GirlFactoryStore struct {
factory Factory
}
func (store *GirlFactoryStore) createGirl(like string) Girl {
return store.factory.CreateGirl(like)
}
具體程式碼
更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star
,你的支援,是我最大的動力!
本作品採用《CC 協議》,轉載必須註明作者和本文連結