Le mode prototype Prototype est en fait un mode de conception créationnel qui génère de nouvelles instances basées sur le prototype de l'instance. Permet de copier des objets, même des objets complexes, sans rendre votre code dépendant de la classe à laquelle ils appartiennent.
Une application typique est l'injection de dépendances, qui devrait être familière à ceux qui ont fait du développement .Net et Java. go dispose également d'un framework d'injection de dépendances
Scènes
La scène de ce numéro est très simple : nous avons implémenté un modèle simple d'injection de dépendances.
Types et interfaces de base
Il s'agit de l'interface prototype, et les instances qui doivent implémenter l'injection de dépendances doivent implémenter cette interface
// 产品接口(原型接口)
type Product interface {
// 用于演示的方法
Use()
// 克隆方法,返回自身的副本(不是指针)
Clone() Product
}
Gestion du pool de prototypes
Il y a une carte à l'intérieur du gestionnaire, et les instances enregistrées sont stockées dans la carte, et les méthodes d'enregistrement de Register() et d'obtention de l'instance du prototype sont fournies Clone()
// 产品管理
type Manager struct {
// 原型池
products map[string]Product
}
// 注册原型到原型池
func (m *Manager) Register(name string, product Product) {
_, ok := m.products[name]
if ok {
return
}
m.products[name] = product
}
// Clone一个对象,返回其副本
func (m *Manager) Clone(name string) Product {
v, ok := m.products[name]
if !ok {
return nil
}
// 调用被克隆对象自身的克隆方法
return v.Clone()
}
accomplir
Définit un type d'iPhone qui implémente l'interface prototype
// 演示产品,实现了原型接口
type IPhone struct {
Name string
}
// 演示方法
func (p *IPhone) Use() {
fmt.Printf("正在使用 %s 打电话\n", p.Name)
}
// 克隆的细节
func (p *IPhone) Clone() Product {
return &IPhone{Name: p.Name + "_clone"}
}
test
Ici, je juge que ce que Clone() renvoie n'est pas le prototype lui-même en affichant le pointeur d'objet
func main() {
iphone7 := IPhone{Name: "IPhone7"}
iphone7.Use()
fmt.Printf("%s 的指针式 %p \n\n", iphone7.Name, &iphone7)
manager := Manager{products: make(map[string]Product)}
manager.Register("iphone7", &iphone7)
clone_iphone7 := manager.Clone("iphone7")
clone_iphone7.Use()
fmt.Printf("clone_iphone7 的指针式 %p \n", &clone_iphone7)
}
résultat de l'opération
Le résultat est comme prévu
Le code a été téléchargé sur Github : LyonNee/design_patterns_with_go : code de modèle de conception basé sur Golang (github.com)