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 }
工厂模式与原型模式的区别
- 工厂模式通过一个模子制造出一个个原始的对象
- 原型模式通过复制一个对象产生它的‘兄弟’
原型模式优缺点
优点:
- 你可以克隆对象, 而无需与它们所属的具体类相耦合。
- 你可以克隆预生成原型, 避免反复运行初始化代码。
- 你可以更方便地生成复杂对象。
- 你可以用继承以外的方式来处理复杂对象的不同配置。
缺点:
- 克隆包含循环引用的复杂对象可能会非常麻烦。
参考
大话设计模式 -- 程杰