Skip to content

原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制(或克隆)一个已经存在的对象来创建一个新的对象,而无需重新实例化它。这种模式在创建对象时非常高效,特别是当对象的创建过程非常复杂或耗时,或者对象需要频繁创建时。

核心思想

原型模式的核心思想是使用一个已经存在的对象作为原型,通过复制这个原型来创建新的对象。这种模式的主要原理是,在某些情况下,直接复制一个已经存在的对象比重新创建一个新对象要高效得多。

优缺点

原型模式的优点包括:

  1. 性能高:使用原型模式可以避免重新创建对象所需的开销,特别是对于复杂的对象或需要频繁创建的对象来说,性能优势尤为明显。
  2. 简化创建过程:原型模式可以简化对象的创建过程,客户端只需要通过调用原型对象的克隆方法来获取新的对象实例,而无需关心对象的创建细节。

然而,原型模式也存在一些缺点:

  1. 需要配备克隆方法:在采用原型模式时,需要在每个具体原型类中实现一个克隆方法,这可能会增加代码的复杂性。
  2. 深拷贝问题:如果原型对象中包含对其他对象的引用,那么在进行克隆时需要处理深拷贝问题,以确保克隆出的对象与原型对象在逻辑上是完全独立的。

使用场景

原型模式适用于以下场景:

  1. 创建对象成本较高:当创建对象的成本较高或创建过程较为复杂时,可以使用原型模式来避免重复创建对象所需的开销。
  2. 需要频繁创建对象:当需要频繁创建对象时,使用原型模式可以提高效率。
  3. 对象的创建过程依赖于其他对象:当对象的创建过程依赖于其他对象的状态或属性时,可以使用原型模式来简化对象的创建过程。

代码实现

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()