极简设计模式-原型模式

PHP技术
385
0
0
2022-07-22

原型模式 - 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)操作。

浅拷贝与深拷贝

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

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