原型在IT領域常被提及,那麼什麼是原型?就產品設計來舉例吧,在產品開發中,產品經理需要根據業務,畫出一個產品原型圖,然後設計,根據產品原型圖畫出設計圖,前端工程師根據設計圖進行將設計圖變爲計算機可執行的代碼。這大概是一個產品開發的流程。在這個體系中,原型是一個重要的存在。程序中的原型也是同樣的意思。在此,原型有一個重要的概念,就是可以根據自身,構建出新的實例。在javascript就是基於原型實現繼承的。
原型設計模式是一種重要的設計模式。go怎麼實現這種複製。
先定義一個原型複製的接口
type Cloneable struct { Clone() Cloneable }
再實現一個原型管理器
type PrototypeManager struct { prototypes map[string]Cloneable } func NewPrototypeManager() *PrototypeManager { return &PrototypeManager{ prototypes: make(map[string]Cloneable), } } func (p *PrototypeManager) Get(name string) Cloneable { return p.prototypes[name] } func (p *PrototypeManager) Set(name string, prototype Cloneable) { p.prototypes[name] = prototype }
來看完整代碼實現
package main import "fmt" type Cloneable interface { Clone() Cloneable } type PrototypeManager struct { prototypes map[string]Cloneable } func NewPrototypeManager() *PrototypeManager { return &PrototypeManager{ prototypes: make(map[string]Cloneable), } } func (m *PrototypeManager) Get(name string) Cloneable{ return m.prototypes[name] } func (m *PrototypeManager) Set(name string, prototype Cloneable) { m.prototypes[name] = prototype } // 測試 type Person struct { name string age int height int } func (p *Person) Clone() Cloneable { person := *p return &person } func main() { manager := NewPrototypeManager() person := &Person{ name: "zhangsan", age: 18, height: 175, } manager.Set("person", person) c := manager.Get("person").Clone() person1 := c.(*Person) fmt.Println("name:", person1.name) fmt.Println("age:", person1.age) fmt.Println("height:", person1.height) }