Skip to content

简介

原型模式,即通过已经创建好的实例作为原型,对这个原型进行克隆(复制),一般用在创建复杂的或者比较耗时的实例创建,因为这种情况下,克隆(复制)一个已经存在的实例使程序运行更高效,也无须知道对象创建的细节。

原型模式中的角色和职责

Clone

需要实现一个clone的方法,以支持拷贝;

代码

此处声明了简历,然后更改部分属性

package main

import "fmt"

/**
 * @Description: 简历类,里面包含简历的基本信息
 */
type Resume struct {
   name       string
   age        int64
   sex        string
   company    string
   experience string
}

/**
 * @Description: 设置简历个人信息
 * @receiver r
 * @param name
 * @param age
 * @param sex
 */
func (r *Resume) setPersonInfo(name string, age int64, sex string) {
   r.name = name
   r.age = age
   r.sex = sex
}

/**
 * @Description: 设置工作经验
 * @receiver r
 * @param company
 * @param experience
 */
func (r *Resume) setWorkExperience(company string, experience string) {
   r.company = company
   r.experience = experience
}

/**
 * @Description: 显示简历内容
 * @receiver r
 */
func (r *Resume) display() {
   fmt.Printf("我的名字是%s,性别%s,今年%d岁,在%s工作,工作经验为:%s \n", r.name, r.sex, r.age, r.company, r.experience)
}

/**
 * @Description: 深拷贝,原型模式的核心
 * @receiver r
 * @return *Resume
 */
func (r *Resume) clone() *Resume {
   return &Resume{
      name:       r.name,
      sex:        r.sex,
      age:        r.age,
      company:    r.company,
      experience: r.experience,
   }
}
func main() {
   fmt.Println("---------------------------原简历")
   resume := &Resume{
      name:       "王工作",
      sex:        "男",
      age:        10,
      company:    "光明顶无限责任公司",
      experience: "学武功和划水、摸鱼",
   }
   resume.display()
   fmt.Println("---------------------------简历特别好,抄")
   copyResume := resume.clone()
   copyResume.setPersonInfo("李工作", 21, "男")
   copyResume.display()
}

总结

优点

  1. 提高实例化性能
  2. 逃避约束
  3. 节省资源

缺点

  1. 需要为每个类实现一个可以clone的方法;

  2. 需要对原类进行修改,特别对于深克隆实现,每一层对象都要实现克隆,实现会比较麻烦,所以对于深或者浅克隆,都要注意;。

适用场景

  1. 对象之间相同或相似,即只是个别的几个属性不同的时候。
  2. 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
  3. 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
  4. 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。