理解设计模式(五)——原型模式

原型模式

理解设计模式(一)——简单工厂 理解设计模式(二)——工厂方法 理解设计模式(四)——建造者

提出问题

当我们需要创建大量相似复杂对象的时候,如果直接采用new的方法,就需要给这些对象全都设置一定的属性。有较多的重复冗余代码。并且,创建对象也十分消耗资源。

如下所示:

// new 创建
let obj1 = new Obj();
obj1.setAttr1(1);
obj1.setAttr2(2);

let obj2 = new Obj();
obj2.setAttr1(1);
obj2.setAttr2(2);

let obj3 = new Obj();
obj3.setAttr1(1);
obj3.setAttr2(2);
// ...

如何解决

既然这些对象有很多相似的地方,那么我们是不是可以只创建一个对象,其他对象都由这个对象复制得来呢?这样我们就不用设置一大堆属性,同时复制也比新建对象消耗的资源要少的多。

因此,我们只创建一个原型对象,其他对象都通过copy这个原型对象创建。如下所示:

// 原型对象复制创建
let proto = new Obj();
proto.setAttr1(1);
proto.setAttr2(2);

let obj1 = proto.copy();

let obj2 = proto.copy();
// ...

具体实现

原型模式最重要的地方就是,能够提供一个copy方法,返回一个复制出来的新对象。而复制由两种方式,一种是深克隆,另一种是浅克隆。

深克隆

即对于数组、对象这样的属性,不是简单的将地址复制,而是将对应的每一项一一复制。原型对象发生改变时,不会影响到新克隆出来的对象。

let newObj = JSON.parse(JSON.stringify(oldObj));

浅克隆

对于数组、对象这样的属性,只是简单的复制地址。原型对象发生改变时,新克隆出来的对象也会跟着一起发生改变。

总结

原型模式主要用于需要创建大量相似对象时。

Author: LeoB_O
Link: https://leob-o.github.io/2019/06/03/PrototypePattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.