原型模式(Prototype Pattern)
GitHub代码链接
原型模式用于创建重复的对象。当一个类在创建时开销比较大时(比如大量数据准备,数据库连接),我们可以缓存该对象,当下一次调用时,返回该对象的克隆。
原型模式是什么
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通过实现克隆clone()操作,快速的生成和原型对象一样的实例。
解决了什么问题
- 资源优化,类初始化要消耗非常多的资源,包括硬件,数据等资源。
- 性能和安全要求的场景
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,使用原型模式。
- 一个对象多个修改者的场景
- 实际项目中,原型模式大多和工厂模式一起出现,通过clone的方法返回一个对象,然后由工厂模式提供给调用者。
优点
- 性能提高
- 逃避构造函数的约束
缺点
- 配备克隆方法要对类的功能进行通盘考虑,对于一些老的类不一定容易,特别当一些类引用不支持串行化的间接对象。
代码实现
1.1 定义一个拥有Clone方法的接口
//ShapeClone 有克隆方法的接口
type ShapeClone interface {
Clone() ShapeClone
}
1.2 原型管理类
实现一个原型管理类,用于保存所有原型。
//ShapeManager 模型管理类,用于保存所有Clone接口的原型
type ShapeManager struct {
ShapeList map[string]ShapeClone
}
//NewShapeManager 新建模型管理类
func NewShapeManager() *ShapeManager {
return &ShapeManager{
ShapeList: make(map[string]ShapeClone),
}
}
//Set 添加原型
func (s *ShapeManager) Set(name string, proto ShapeClone) {
s.ShapeList[name] = proto
}
//Get 获取原型
func (s *ShapeManager) Get(name string) ShapeClone {
return s.ShapeList[name]
}
1.3 实现几个原型类
//Circle 圆形类,实现shapeclone接口
type Circle struct {
Name string
}
//NewCircle 新建一个CIrcle类
func NewCircle(name string) *Circle {
return &Circle{Name: name}
}
//GetName 获取circle的名字
func (c *Circle) GetName() string {
return c.Name
}
//Clone 返回circle类的复制
func (c *Circle) Clone() ShapeClone {
circleClone := c
return circleClone
}
//Draw circle的方法
func (c *Circle) Draw() {
fmt.Println("Circle Draw().")
}
有疑问加站长微信联系(非本文作者)