原型模式
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
实现
- 定义一个原型对象需要实现的接口
//原型对象需要实现的接口
//拷贝原有的数据
type CloneAble interface {
Clone() 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
}
- 实现几个原型类
type Type1 struct {
name string
}
func (t *Type1)Clone() CloneAble {
tc := *t
return &tc
}
type Type2 struct {
name string
}
func (t *Type2)Clone() CloneAble {
tc := *t
return &tc
}
- 测试
func TestNewProtoTypeManager(t *testing.T) {
mgr := NewProtoTypeManager()
t1 := &Type1{name:"type1"}
mgr.Set("t1",t1)
t11 := mgr.Get("t1")
t22 := t11.Clone()
if t11 == t22 {
fmt.Println("clone address")
}else{
fmt.Println("clone value")
}
}
优点
1、性能提高。对客户隐藏了具体的产品类,因此减少了客户知道对象的数目。此外,这些模式使客户无需改变即可使用与特定应用相关的类(和工厂模式、建造者模式一样的效果)
2、高效。运行时刻增加和删除产品,原型模式允许只通过客户注册原型实例就可以将一个新的具体产品类型注入系统。
缺点
每种具体实现类型都要有一个克隆自己的操作。在某些场景会比较困难。