一、概述
原型模式的定义是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。简单来说就是拷贝一个新对象。
拷贝通常有浅拷贝和深拷贝,那么js中浅拷贝很容易实现,所以接下来主要用该模式实现深拷贝。
例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
优点 :
1、性能提高。
2、逃避构造函数的约束。
缺点 :
1、配备克隆方法需要对类的功能进行全面考虑,这对于全新的类不是很难,但对于已有的类不一定很容易。
2、必须实现 Cloneable 接口的方法。
使用场景 :
1、资源优化场景。
2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
3、性能和安全要求的场景。
4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
5、一个对象多个修改者的场景。
6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。
二、运用
原型模式的角色:
Prototype:抽象原型角色,抽象类或者接口,用来声明clone方法。
ConcretePrototype:具体的原型类,是客户端角色使用的对象,即被复制的对象。
Prototype 类
ConcretePrototype 类
ConcretePrototype1 和 ConcretePrototype2 就是用户使用的普通对象,原型模式中让一个普通对象拷贝一个自己,仅需要继承 Prototype 类,重写 clone 方法即可。
test: