原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制(或克隆)一个已经存在的对象来创建一个新的对象,而无需重新实例化它。这种模式在创建对象时非常高效,特别是当对象的创建过程非常复杂或耗时,或者对象需要频繁创建时。
核心思想
原型模式的核心思想是使用一个已经存在的对象作为原型,通过复制这个原型来创建新的对象。这种模式的主要原理是,在某些情况下,直接复制一个已经存在的对象比重新创建一个新对象要高效得多。
优缺点
原型模式的优点包括:
- 性能高:使用原型模式可以避免重新创建对象所需的开销,特别是对于复杂的对象或需要频繁创建的对象来说,性能优势尤为明显。
- 简化创建过程:原型模式可以简化对象的创建过程,客户端只需要通过调用原型对象的克隆方法来获取新的对象实例,而无需关心对象的创建细节。
然而,原型模式也存在一些缺点:
- 需要配备克隆方法:在采用原型模式时,需要在每个具体原型类中实现一个克隆方法,这可能会增加代码的复杂性。
- 深拷贝问题:如果原型对象中包含对其他对象的引用,那么在进行克隆时需要处理深拷贝问题,以确保克隆出的对象与原型对象在逻辑上是完全独立的。
使用场景
原型模式适用于以下场景:
- 创建对象成本较高:当创建对象的成本较高或创建过程较为复杂时,可以使用原型模式来避免重复创建对象所需的开销。
- 需要频繁创建对象:当需要频繁创建对象时,使用原型模式可以提高效率。
- 对象的创建过程依赖于其他对象:当对象的创建过程依赖于其他对象的状态或属性时,可以使用原型模式来简化对象的创建过程。
代码实现
在typescript中,可以通过Object.create()基于某一个对象作为原型创建新的对象。
typescript
const person = {
name: "",
isHuman: false,
printIntroduction: function () {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
},
};
const me = Object.create(person);
me.name = "Matthew";
me.isHuman = true;
me.printIntroduction();
console.log(me);基于lodash的深度克隆实现:
typescript
import _ from "lodash";
const person = {
name: "",
isHuman: false,
printIntroduction: function () {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
},
};
const me = _.cloneDeep(person);
me.name = "Eddie"
me.printIntroduction()