持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天
介绍
- 原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
其实原型模式就是指定新创建对象的模型,更通俗一点来说就是我想要新创建的对象的原型是我指定的对象。
使用场景
-
当一个系统应该独立于它的产品创建,构成和表示时。
-
当要实例化的类是在运行时刻指定时,例如,通过动态装载。
-
为了避免创建一个与产品类层次平行的工厂类层次时。
-
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
应用实践
职责明确
- 原型:接口将克隆方法进行声明。在绝大多数情况下,其中只会有一个名为
clone的方法 - 具体原型:类将实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖等等
- 客户端:可以复制实现了原型接口的任何对象
Object.create实现原型模式
Object.create()的用法 Object.create()方法用于创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
语法:
proto新创建对象的原型对象。 propertiesObject可选。如果没有指定为 undefined,则是要添加到新创建对象的不可枚举(默认)属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
返回值:一个新对象,带着指定的原型对象和属性
实现
interface PrototypeObj {
clone():Prototype;
}
class Instance implements PrototypeObj { public name: string;
constructor(name) {
this.name = name
}
// 实现复制
public clone(): Prototype {
return Object.create(this);
}
}
//创建
const instance1 = new Instance('实例1')
console.log(instance1.name);instance1.name = 'test'
const instance2 = Object.create(instance1)
console.log(instance2.name);
原型关系
汇总
优点特性
-
简化创立新对象的过程并提高效率。
-
可动静获取对象运行时的状态。
-
原始对象变动相应克隆对象也会发生变化。
-
原型模式有一个特点,在任何时候,都可以对基类或者子类进行方法的拓展,而且,所有被实例化的对象或者类都能获取这些方法。
缺点弊端
- 对已有类批改时,须要批改源码,违反了开闭准则。
- 须要为每一个类都配置一个
clone办法。 - 当实现深拷贝时,须要编写较为简单的代码,并且当对象之间存在多层嵌套的援用时,为了实现深拷贝,每一层对象对象的类都必须反对深拷贝,实现起来比拟麻烦,减少了程序的复杂程度。
- 原型并不基于继承, 因此没有继承的缺点。另一方面,原型需要对被复制对象进行复杂的初始化。