原型模式 – 克隆

最后更新于:2022-04-02 04:19:15

[TOC] ## 概述 亦称: 克隆、 Clone、 Prototype
- **原型模式**是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。 - 相比正常创建一个对象 (new Foo () ),首先创建一个原型,然后克隆它会更节省开销。 ## 原型模式结构 1. **原型**(Prototype)接口将对克隆方法进行声明。在绝大多数情况下,其中只会有一个名为`clone`克隆的方法。 2. **具体原型**(Concrete Prototype)类将实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖等等。 3. **客户端**(Client)可以复制实现了原型接口的任何对象。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/e8/30/e8306d51fac497fd182b30235b56d1c4_1000x800.png) **伪代码** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/45/70/457013e43363ed6a35c6e8c8790e7bf8_940x660.png) ## 原型模式适合应用场景 1. 如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。 2. 如果子类的区别仅在于其对象的初始化方式, 那么你可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。 ## 与其他模式的关系 - 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。 - 抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法。 - 原型可用于保存命令模式的历史记录。 - 原型并不基于继承, 因此没有继承的缺点。 另一方面, 原型需要对被复制对象进行复杂的初始化。 工厂方法基于继承, 但是它不需要初始化步骤。 - 有时候原型可以作为备忘录模式的一个简化版本, 其条件是你需要在历史记录中存储的对象的状态比较简单, 不需要链接其他外部资源, 或者链接可以方便地重建。 - 抽象工厂、 生成器和原型都可以用单例模式来实现。
';