
原型模式使用原型实例来指定创建的对象的类型,并通过复制原型对象来创建新对象.
原型模式提供了一个接口(克隆),用于通过现有对象创建新对象. clone()的实现是特定于语言的,并且通过复制构造函数以C ++实现.
原型模式实际上是在不知道任何创建细节的情况下,从一个对象创建另一个可自定义对象. 在初始化信息不变的情况下,克隆是最好的方法,它不仅隐藏了对象创建的细节,而且还大大提高了性能. 因为如果您不使用克隆,则需要在每次新建时执行构造函数. 如果构造函数执行时间很长,那么多次执行初始化操作的效率太低.
当原型模式实现克隆接口时原型模式,必须使用深拷贝.
原型模型着重于根据自己的任务创建新的类对象,隐藏创建的细节.


原型(Prototype)角色: 指定特定原型对象必须实现的接口(如果要提供深层副本,则必须提供实现克隆的条件)
具体原型(ConcretePrototype): 派生自抽象原型,是客户端程序使用的对象,即复制的对象,需要实现抽象原型角色所需的接口.
客户端(客户端)角色: 使用原型对象的客户端程序
好处:
A. 原型模型向客户隐藏了特定的产品类别
B. 在运行时添加和删除产品: 原型模式仅允许通过向客户注册原型实例将新的特定产品类合并到系统中.

C. 更改值以指定新对象: 高度动态的系统允许通过对象组成来定义新行为. 例如,通过将值分配给对象变量而不定义新类. 通过实例化现有的类并将实例注册为客户对象的原型,可以有效地定义新的对象类. 客户可以将责任委托给原型,从而展示新的行为.
D. 更改结构以指定新对象: 许多应用程序都从零件和子零件创建对象.
E. 为了减少子类的构造,“原型”模式可以克隆原型,而不是请求工厂方法来生成新对象.
F. 用类动态配置应用程序某些运行时环境允许将类动态加载到应用程序中.
G. 使用原型模式创建对象要比新对象的性能好得多,因为Object类的clone方法是一种本地方法,可以直接操作内存中的二进制流,尤其是在复制大型对象时. 区别非常明显.
H. 使用原型模式的另一个优点是简化了对象的创建,使创建对象变得容易.

缺点:
原型模式的主要缺点是抽象原型Prototype的每个子类都必须实现克隆操作,并且可能难以实现克隆功能. 当所考虑的类已经存在时,很难添加克隆操作. 当内部包含一些不支持复制或具有循环引用的对象时,也可能难以实现克隆.
原型模式的主要思想是基于现有对象克隆一个新对象. 通常,clone方法是由对象内部提供的,并通过clone方法返回对象的副本.
原型使用场景:
A. 在应独立于产品创建,组成和表示系统时,请使用原型模式
B. 在运行时指定要实例化的类时,例如通过动态加载

C. 为了避免创建与产品类层次结构平行的工厂类层次结构
D. 当一个类的实例只能具有状态的几种不同组合之一时. 与每次手动以适当的状态手动实例化原型类相比,构建相应数量的原型并克隆原型可能更方便.
A. 浅拷贝
复制的对象的所有变量都具有与原始对象相同的值,并且对其他对象的引用仍然引用原始对象. 也就是说,浅表复制仅负责当前的对象实例,而不复制被引用的对象.

B,深拷贝
复制对象的所有变量都包含与原始对象相同的值,但引用其他对象的变量除外. 引用其他对象的变量将指向复制的新对象,而不是原始引用的对象. 也就是说,深层复制会将要复制的对象引用的所有对象复制一次.
深度复制应该进行多少层是一个不确定的问题. 在决定通过深层复制来复制对象时,必须决定是采用浅层复制还是深层复制,还是继续对间接复制对象使用深层复制. 因此,在进行深拷贝时原型模式,有必要确定要考虑多深. 另外,在深度复制过程中,很可能会出现循环引用的问题.

本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-177222-1.html
就你这智商也学人借打假之名来坑人