プロトタイプ プロトタイプ モードは、実際には、インスタンスのプロトタイプに基づいて新しいインスタンスを生成する作成設計モードです。オブジェクトが属するクラスにコードを依存させることなく、複雑なオブジェクトであってもオブジェクトをコピーできます。
典型的なアプリケーションは依存性注入です。これは、.Net および Java 開発を行ったことがある人にはおなじみのはずです。go には依存性注入フレームワークもあります
シーン
この号のシーンは非常に単純で、単純な依存性注入モデルを実装しています。
基本的な型とインターフェース
これはプロトタイプ インターフェイスであり、依存性注入を実装する必要があるインスタンスは、このインターフェイスを実装する必要があります。
// 产品接口(原型接口)
type Product interface {
// 用于演示的方法
Use()
// 克隆方法,返回自身的副本(不是指针)
Clone() Product
}
プロトタイププール管理
Manager の内部に Map があり、登録されたインスタンスは Map に格納され、Register() の登録とプロトタイプのインスタンスの取得のメソッドが提供されます 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()
}
達成
プロトタイプ インターフェイスを実装する IPhone 型を定義します。
// 演示产品,实现了原型接口
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"}
}
テスト
ここでオブジェクトポインタを出力することで Clone() が返すのはプロトタイプそのものではないと判断します
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)
}
運用実績
結果は予想通り
コードは Github にアップロードされています: LyonNee/design_patterns_with_go: Golang ベースのデザイン パターン コード (github.com)