• 第四章:分身术 - 原型模式

    第四章:分身术 - 原型模式

    武林秘籍

    在编程江湖中,有一门绝世武功名为"分身术",能够复制自身,制造多个分身。

    而在设计模式中,有一门与之对应的绝学——原型模式

    何为原型?

    原型模式,就是通过复制现有的对象来创建新的对象,而不是通过新建。

    就像武林中的分身术,复制一个一模一样的自己。

    武功心法

    <?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";
    ?>
    

    江湖应用

    1. 对象复制 - 如同武林中的分身术
    2. 避免重复创建 - 如同武林中的节省内力
    3. 动态配置 - 如同武林中的变化万千

    分身术要诀

    • 一分为二:一个对象变两个,两个变四个
    • 形神兼备:复制的对象与原对象一模一样
    • 随心所欲:可以随时创建新的分身

    修炼要点

    1. 实现Clone接口:对象必须实现克隆方法
    2. 深浅拷贝:注意对象内部引用的处理
    3. 性能考虑:复制比新建可能更高效

    下回预告:第五章:万剑归宗 - 装饰器模式

    本文章由设计模式武侠传系列发布