极简设计模式-原型模式

原型模式 - Prototype Pattern

定义

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

结构中包含的角色

  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)操作。

浅拷贝与深拷贝

浅拷贝 : 被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
深拷贝 : 完整复制一个对象。深拷贝把要拷贝的对象所引用的对象也拷贝了一次。可以使用序列化来做深拷贝。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
pndx

这个深浅拷贝还是不太懂

3年前 评论
long2ge (楼主) 3年前
pndx (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!