# 原型模式 原型模式`Prototype Pattern`用原型实例指向创建对象的类,使用于创建新的对象的类的共享原型的属性与方法。 ## 概述 在`JavaScript`中可以利用其特有的原型继承特性去实现创建对象的方式,也就是创建的一个对象作为另外一个对象的`prototype`属性值,原型对象本身就是有效地利用了每个构造器创建的对象,其将实例之间相同的属性和方法提取成共有的属性和方法,而这些属性与方法都可以被实例共享。 在`Java`中通常是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,即通过一个抽象类实现`Cloneable`接口以及重写`Object`类中的`clone`方法,之后使用子类继承此抽象类并在一个缓存类中使用集合类例如`HashTable`进行存储,当需要类时便可以找到`HashTable`中该类通过`clone`实现得到一个新的子类,使用原型模式创建对象比直接`new`一个对象在性能上要好的多,因为`Object`类的`clone`方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单,所以在需要重复地创建相似对象时可以考虑使用原型模式,此外深拷贝与浅拷贝问题中,会发生深拷贝的有`Java`中的`8`种基本类型以及他们的封装类型以及`String`类型,其余的都是浅拷贝。 ### 优点 * 提高性能。 * 避免构造函数的约束。 ### 缺点 * 在原型中需要对所有类的功能进行考虑。 * 创建对象不会调用类的构造方法。 ## 实现 ```javascript var Shape = { name : null, say: function(){ console.log(this.name); } } var rectangle = Object.create(Shape); rectangle.name = "Rectangle"; rectangle.say(); // Rectangle var square = Object.create(Shape); square.name = "Square"; square.say(); // Square var circle = Object.create(Shape); circle.name = "Circle"; circle.say(); // Circle ``` ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 参考 ``` https://segmentfault.com/a/1190000012427846 https://www.runoob.com/design-pattern/prototype-pattern.html https://wiki.jikexueyuan.com/project/java-design-pattern/prototype-pattern.html ```