模式定义

指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

类图

在这里插入图片描述

应用场景

当代码不应该依赖于需要复制的对象的具体类时

优点

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 ProtoType

type Type1 struct {
   name string
}

func (t * Type1) Clone() Cloneable {
   tc := *t  //开辟内存新建变量,存储指针指向的内容
   return &tc
   //return t
}

type2.go

package ProtoType

type Type2 struct {
   name string
}

func (t * Type2) Clone() Cloneable {
   tc := *t //开辟内存新建变量,存储指针指向的内容
   return &tc
}

prototype_test.go

package ProtoType

import (
   "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("深拷贝")
   }
}

Yuan_sr
18 声望6 粉丝