原型模式 - Prototype Pattern
定义
用原型实例来确定要创建对象的类型,并通过复制原型来创建新的对象。
结构中包含的角色
- Prototype(抽象原型角色):声明一个克隆自身的接口
- 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));
}
}
一句话概括设计模式
克隆对象。
设计的原则和思想
克隆对象。
优点
- 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程。
- 逃避构造函数的约束。
- 深克隆保存对象的状态,可以实现状态模式。
缺点
- 每一个类都需要一个克隆方法,代码没法重用。
- 克隆包含循环引用的复杂对象会非常麻烦。
何时使用
- 创建一个对象的成本较高。
- 一个对象,多个调用者的场景。
实际应用场景
- Laravel 里面的Builder复制。
- JAVA 中的 Object clone() 方法。
- 电脑上的复制(Ctrl + C)和粘贴(Ctrl + V)操作。
浅拷贝与深拷贝
浅拷贝 : 被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
深拷贝 : 完整复制一个对象。深拷贝把要拷贝的对象所引用的对象也拷贝了一次。可以使用序列化来做深拷贝。