模式定义
指原型实例指定创建对象的品种,并且通过拷贝这些原型创立新的对象
类图
利用场景
当代码不应该依赖于须要复制的对象的具体类时
长处
1.以不耦合具体类的状况下克隆对象;
2.防止反复的初始化代码;
3.更不便的构建简单对象;
要点总结
- Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”领有“稳固的接口”
- Prototype模式对于“如何创立易变类的实体对象”采纳“原型克隆”的办法来做,它使得咱们能够非常灵活地动态创建“领有某些稳固接口”的新对象--所需工作仅仅是注册一个新类的对象(即原型),而后在任何须要的中央Clone
Go语言代码实现
工程目录
prototype.go
package ProtoType//原型对象须要实现的接口type Cloneable interface { Clone() Cloneable}//原型对象的类type ProtoTypeManger struct { Prototypes map[string]Cloneable}//结构初始化办法func NewProtoTypeManger () * ProtoTypeManger { return &ProtoTypeManger{make(map[string]Cloneable)}}//抓取func (p *ProtoTypeManger) Get (name string) Cloneable { return p.Prototypes[name]}//设置func (p *ProtoTypeManger) Set (name string, prototype Cloneable) { p.Prototypes[name] = prototype}
type1.go
package ProtoTypetype Type1 struct { name string}func (t * Type1) Clone() Cloneable { tc := *t //开拓内存新建变量,存储指针指向的内容 return &tc //return t}
type2.go
package ProtoTypetype Type2 struct { name string}func (t * Type2) Clone() Cloneable { tc := *t //开拓内存新建变量,存储指针指向的内容 return &tc}
prototype_test.go
package ProtoTypeimport ( "fmt" "testing")func TestNewProtoTypeManger(t *testing.T) { mgr := NewProtoTypeManger() t1 := &Type1{name:"type1"} mgr.Set("t1", t1) t11 := mgr.Get("t1") t22 := t11.Clone() if t11 == t22 { fmt.Println("浅拷贝") } else { fmt.Println("深拷贝") }}