原型模式 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 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~