第四章:分身术 - 原型模式
武林秘籍
在编程江湖中,有一门绝世武功名为"分身术",能够复制自身,制造多个分身。
而在设计模式中,有一门与之对应的绝学——原型模式。
何为原型?
原型模式,就是通过复制现有的对象来创建新的对象,而不是通过新建。
就像武林中的分身术,复制一个一模一样的自己。
武功心法
<?php
/**
* 分身术 - 原型模式
* 一分为二,形神兼备
*/
// 原型接口
interface Prototype {
public function clone();
}
// 具体原型 - 武林高手
class Warrior implements Prototype {
private $name;
private $skill;
private $weapon;
public function __construct($name, $skill, $weapon) {
$this->name = $name;
$this->skill = $skill;
$this->weapon = $weapon;
}
// 克隆方法(浅拷贝)
public function clone() {
return new self($this->name, $this->skill, $this->weapon);
}
// 深拷贝方法
public function deepClone() {
// 对于复杂对象,需要深拷贝
$cloned = clone $this;
// 如果weapon是对象,也需要克隆
if (is_object($this->weapon)) {
$cloned->weapon = clone $this->weapon;
}
return $cloned;
}
public function getName() {
return $this->name;
}
public function getSkill() {
return $this->skill;
}
public function getWeapon() {
return $this->weapon;
}
public function display() {
return "高手:{$this->name},绝技:{$this->skill},兵器:{$this->weapon}";
}
}
// 武器类
class Weapon {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
// 使用示例
echo "=== 分身术 - 原型模式示例 ===\n";
// 创建原版高手
$original = new Warrior("张三", "独孤九剑", "倚天剑");
echo "原版:{$original->display()}\n";
// 克隆一个分身
$clone1 = $original->clone();
echo "分身1:{$clone1->display()}\n";
// 验证是否为不同对象
if ($original !== $clone1) {
echo "✅ 克隆成功,分身与原版是不同对象\n";
} else {
echo "❌ 克隆失败,分身与原版是同一对象\n";
}
// 验证属性是否相同
if ($original->getName() === $clone1->getName()) {
echo "✅ 属性相同,分身与原版一模一样\n";
}
// 创建多个分身
$clone2 = $original->clone();
$clone3 = $original->clone();
echo "\n创建多个分身:\n";
echo "分身2:{$clone2->display()}\n";
echo "分身3:{$clone3->display()}\n";
?>
江湖应用
- 对象复制 - 如同武林中的分身术
- 避免重复创建 - 如同武林中的节省内力
- 动态配置 - 如同武林中的变化万千
分身术要诀
- 一分为二:一个对象变两个,两个变四个
- 形神兼备:复制的对象与原对象一模一样
- 随心所欲:可以随时创建新的分身
修炼要点
- 实现Clone接口:对象必须实现克隆方法
- 深浅拷贝:注意对象内部引用的处理
- 性能考虑:复制比新建可能更高效
下回预告:第五章:万剑归宗 - 装饰器模式
本文章由设计模式武侠传系列发布