原型模式 Prototype Pattern

未匹配的标注

定义

用原型实例来确定要创建对象的类型,并通过复制原型来创建新的对象。

设计的原则和思想

  1. 解耦了对象的创建和使用。
  2. 不变部分是使用,变化部分是创建。
  3. 核心思想是通过复制的方式去生成对象。

一句话概括设计模式

克隆对象。

结构中包含的角色

  1. Prototype(抽象原型角色):声明一个克隆自身的接口
  2. Concrete Prototype(具体原型角色):实现一个克隆自身的操作

最小可表达代码

// 定义拷贝接口
interface Cloneable
{
    public function copy();
    public function deepCopy();
}

// 具体实现
class ConcreteCloneable
{
    // 浅拷贝
    public function copy()
    {
        return clone $this;
    }

    // 深拷贝
    public function deepCopy()
    {
        return unserialize(serialize($this));
    }
}

优点

  1. 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程。
  2. 逃避构造函数的约束。
  3. 深克隆保存对象的状态,可以实现状态模式。

缺点

  1. 每一个类都需要一个克隆方法,代码没法重用。
  2. 克隆包含循环引用的复杂对象会非常麻烦。

何时使用

  1. 创建一个对象的成本较高。
  2. 一个对象,多个调用者的场景。

实际应用场景

  1. Laravel 里面的Builder复制。
  2. JAVA 中的 Object clone() 方法。
  3. 电脑上的复制(Ctrl + C)和粘贴(Ctrl + V)操作。

浅拷贝与深拷贝

浅拷贝 : 被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。

深拷贝 : 完整复制一个对象。深拷贝把要拷贝的对象所引用的对象也拷贝了一次。可以使用序列化来做深拷贝。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~