类图+案例+代码详解:软件设计模式----原型模式

5、原型模式

通过复制现有对象来创建新对象,避免从零开始构建,就像 "复印文件" 一样。

克隆的核心是复用现有对象状态

用 克隆熊猫 举例,秒懂原理

假设你有一只熊猫对象(属性:名字、年龄、毛色),想快速创建 10 只一模一样的熊猫:

不用原型模式: 每次 new 一个熊猫,手动设置所有属性(名字 ="盼盼",年龄 = 3 岁,毛色 = 黑白...),重复劳动。
用原型模式: 直接复制(克隆)已有的熊猫对象,新对象会继承所有属性,只需修改少数不同的地方(比如名字改成 "圆圆")。

原型模式的核心角色(3 步走)

  1. 原型(Prototype): 定义克隆自己的接口(如clone()方法)。
  2. 具体原型(Concrete Prototype): 实现克隆逻辑,比如熊猫类。
  3. 客户端(Client): 通过复制原型创建新对象。

为什么要用原型模式?

场景对比:
创建复杂对象时: 比如一个游戏角色有 100 个属性,从零创建容易出错,复制现有角色更高效。
需要多次创建相似对象时: 比如电商网站生成 100 个 "默认地址" 模板,复制比新建更快。

核心优势

  1. 减少重复初始化: 直接复制现有对象状态,比 new 对象后再设值更高效。
  2. 方便扩展对象类型: 新增角色时,只需复制现有原型并修改部分属性,无需修改创建逻辑。
  3. 隔离对象创建细节: 客户端不用知道对象如何构建,只需复制原型。

代码示例

java 复制代码
// 1. 原型接口:实现Cloneable接口并覆盖clone方法  
class Panda implements Cloneable {
    private String name;
    private int age;
    private String color = "黑白"; // 共享属性,所有熊猫默认毛色相同
    
    public Panda(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 克隆方法(浅拷贝)
    @Override
    protected Panda clone() throws CloneNotSupportedException {
        return (Panda) super.clone();
    }
    
    //  setter/getter
    public void setName(String name) { this.name = name; }
    public String getName() { return name; }
    public void setAge(int age) { this.age = age; }
    public int getAge() { return age; }
    public String getColor() { return color; }
}

// 2. 客户端:复制原型创建新对象  
public class PrototypeDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 初始原型:熊猫"盼盼"
        Panda original = new Panda("盼盼", 3);
        
        // 克隆出熊猫"圆圆"
        Panda clone1 = original.clone();
        clone1.setName("圆圆");
        clone1.setAge(2);
        
        // 克隆出熊猫"团团"
        Panda clone2 = original.clone();
        clone2.setName("团团");
        clone2.setAge(4);
        
        // 输出结果
        System.out.println("原型:" + original.getName() + 
                          ",年龄:" + original.getAge() + 
                          ",毛色:" + original.getColor());
        System.out.println("克隆1:" + clone1.getName() + 
                          ",年龄:" + clone1.getAge() + 
                          ",毛色:" + clone1.getColor());
        System.out.println("克隆2:" + clone2.getName() + 
                          ",年龄:" + clone2.getAge() + 
                          ",毛色:" + clone2.getColor());
    }
}

深拷贝 vs 浅拷贝

  • 浅拷贝: 只复制对象本身,不复制其引用的对象(如上面的clone()方法)。
    → 若原型中有数组或集合,克隆对象会和原型共享该数据,修改会互相影响。
  • 深拷贝: 递归复制所有引用的对象(需手动实现)。
    → 如序列化对象后再反序列化,确保克隆对象完全独立。
  1. 原型模式和工厂模式的区别
    • 工厂模式:根据参数 "新建" 对象(从无到有)。
    • 原型模式:根据现有对象 "复制" 新对象(从有到有)。
  2. 实际场景举例
    • 游戏中复制 NPC:怪物、NPC 的属性通过复制原型快速生成。
    • Spring 框架中的Bean复制:通过BeanUtils.cloneBean()复制对象。
相关推荐
凤凰院凶涛QAQ4 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛4 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1144 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
w_zero_one5 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan6 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David6 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源6 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David7 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122667 小时前
网络编程^
java
Thinker QAQ7 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing