.
└── src
└── chapter08
└── clsfactory
├── main.go
└── base
└── factory.go
└── cls1
└── reg.go
└── cls2
└── reg.go
本套教學所有原始碼下載地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ 提取密碼:hfyf類工廠(具體檔案:…/chapter08/clsfactory/base/factory.go)
package base // 類介面 type Class interface { Do() } var ( // 儲存註冊好的工廠資訊 factoryByName = make(map[string]func() Class) ) // 註冊一個類生成工廠 func Register(name string, factory func() Class) { factoryByName[name] = factory } // 根據名稱建立對應的類 func Create(name string) Class { if f, ok := factoryByName[name]; ok { return f() } else { panic("name not found") } }這個包叫base,負責處理註冊和使用工廠的基礎程式碼,該包不會參照任何外部的包。
func() Class
的普通函數,呼叫此函數,建立一個類範例,實現的工廠內部結構體會實現 Class 介面。package cls1 import ( "chapter08/clsfactory/base" "fmt" ) // 定義類1 type Class1 struct { } // 實現Class介面 func (c *Class1) Do() { fmt.Println("Class1") } func init() { // 在啟動時註冊類1工廠 base.Register("Class1", func() base.Class { return new(Class1) }) }上面的程式碼展示了Class1的工廠及產品定義過程。
package cls2 import ( "chapter08/clsfactory/base" "fmt" ) // 定義類2 type Class2 struct { } // 實現Class介面 func (c *Class2) Do() { fmt.Println("Class2") } func init() { // 在啟動時註冊類2工廠 base.Register("Class2", func() base.Class { return new(Class2) }) }Class2 的註冊與 Class1 的定義和註冊過程類似。
package main import ( "chapter08/clsfactory/base" _ "chapter08/clsfactory/cls1" // 匿名參照cls1包, 自動註冊 _ "chapter08/clsfactory/cls2" // 匿名參照cls2包, 自動註冊 ) func main() { // 根據字串動態建立一個Class1範例 c1 := base.Create("Class1") c1.Do() // 根據字串動態建立一個Class2範例 c2 := base.Create("Class2") c2.Do() }下面是對程式碼的說明:
export GOPATH=/home/davy/golangbook/code
go install chapter08/clsfactory
$GOPATH/bin/clsfactory
Class1
Class2