7. 设计模式之原型模式

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

在一些后台管理系统中,我们经常会遇到复制某条数据的功能,比如在教务系统中,老师新建了一条学生的数据之后,可以将上一条学生的数据复制一条,然后只需要修改学生的姓名、性别、联系方式字段就行。与这种场景相对应的设计模式就是原型模式,原型模式将一个对象进行复制产生新的对象。

// 学生构造函数
class Student {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  setName(name = "") {
    this.name = name;
  }

  setAge(age = 0) {
    this.age = age;
  }

  clone() {
    return this;
  }
}

// 构造学生A
const A = new Student('A', 12);
console.log(A); // { name: 'A', age: 12 }

A.setAge(14);

// 构造学生B
const B = A.clone();
console.log(B); // { name: 'A', age: 14 }

A.setAge(16);
// 需要注意对生成对象进行处理,防止循环引用问题
console.log(A); // { name: 'A', age: 16 }
console.log(B); // { name: 'A', age: 16 }

工厂模式与原型模式的区别

  1. 工厂模式通过一个模子制造出一个个原始的对象
  2. 原型模式通过复制一个对象产生它的‘兄弟’

原型模式优缺点

优点:

  • 你可以克隆对象, 而无需与它们所属的具体类相耦合。
  • 你可以克隆预生成原型, 避免反复运行初始化代码。
  • 你可以更方便地生成复杂对象。
  • 你可以用继承以外的方式来处理复杂对象的不同配置。

缺点:

  • 克隆包含循环引用的复杂对象可能会非常麻烦。

参考

大话设计模式 -- 程杰

原型模式