编程自学指南:java程序设计开发,原型模式的核心思想:通过复制现有对象创建新对象,掌握Cloneable接口与clone()方法的使用,区分深拷贝与浅拷贝

编程自学指南:java程序设计开发,Java 原型设计模式

一、课程信息

学习目标

  1. 理解原型模式的核心思想:通过复制现有对象创建新对象
  2. 掌握Cloneable接口与clone()方法的使用
  3. 能区分深拷贝与浅拷贝,避免对象共享问题
  4. 运用原型模式优化对象创建性能,减少重复代码

二、课程导入:生活中的复制

🌰 场景 1:简历批量修改

  • 有 100 份简历,大部分内容相同,仅姓名和电话不同
  • 传统方式:每份简历单独创建,重复代码多
  • 原型方式:复制基础简历,修改差异部分

三、核心概念与角色

1. 模式定义

通过复制(克隆)现有对象来创建新对象,避免直接实例化。
核心:以现有对象为模板(原型),快速创建相似对象

2. 核心角色

角色名称作用案例类比
原型类实现克隆接口,提供克隆方法Resume类(实现 Cloneable)
具体原型实现具体克隆逻辑,处理深拷贝 / 浅拷贝TechResumeMarketingResume

四、实现步骤与案例

🔧 案例 1:简历克隆(浅拷贝)

步骤 1:实现 Cloneable 接口
class Resume implements Cloneable {
    private String name;
    private int age;
    private String[] skills; // 引用类型

    public Resume(String name, int age, String[] skills) {
        this.name = name;
        this.age = age;
        this.skills = skills;
    }

    // 重写clone方法(默认是浅拷贝)
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    // 省略getter/setter和toString
}
步骤 2:客户端克隆
public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        String[] skills = {"Java", "MySQL"};
        Resume original = new Resume("张三", 25, skills);
        
        // 克隆简历
        Resume copy = (Resume) original.clone();
        copy.setName("李四");
        skills[0] = "Python"; // 原技能数组被修改
        
        System.out.println("原简历:" + original); // skills: [Python, MySQL]
        System.out.println("克隆简历:" + copy);   // skills: [Python, MySQL]
    }
}

🔍 浅拷贝问题分析

  • 现象:修改原对象的引用类型属性,克隆对象也会改变
  • 原因:浅拷贝只复制对象的基本类型属性,引用类型共享内存地址

🔧 案例 2:深拷贝实现

修改 Resume 类(深拷贝)
@Override
protected Object clone() throws CloneNotSupportedException {
    // 1. 调用父类浅拷贝
    Resume clone = (Resume) super.clone();
    
    // 2. 深拷贝引用类型属性
    clone.skills = new String[skills.length];
    System.arraycopy(skills, 0, clone.skills, 0, skills.length);
    
    return clone;
}
测试深拷贝效果
skills[0] = "Python"; // 原技能数组修改
System.out.println("原简历:" + original.getSkills()[0]); // Python
System.out.println("克隆简历:" + copy.getSkills()[0]);   // Java(不受影响)

五、JDK 中的原型模式

1. String类的克隆

String str = new String("Hello");
String copy = (String) str.clone(); // 浅拷贝(String不可变,无需深拷贝)

2. 数组的克隆

int[] arr = {1, 2, 3};
int[] copy = arr.clone(); // 浅拷贝(基本类型数组)

六、适用场景与优缺点

✅ 优点

  1. 性能优化:避免复杂对象的重复初始化(如数据库连接、网络请求)
  2. 简化创建:无需知道对象创建细节,直接复制现有对象

⚠️ 缺点

  • 深拷贝实现复杂:对象包含多层引用时,需递归克隆
  • 破坏封装clone()方法是protected,需暴露给客户端

🔥 适用场景

  1. 对象创建成本高:如游戏角色(包含大量装备、技能)
  2. 批量生成相似对象:如电商订单模板、报表模板

七、课堂练习

练习 1:游戏角色克隆

需求

  • 定义GameCharacter类,包含namelevelEquipment(装备类)
  • 实现深拷贝,确保克隆角色的装备独立

练习 2:优化简历克隆

任务:将案例 1 的浅拷贝改为深拷贝,确保技能数组独立

八、课程总结

知识图谱:

原型模式 → 通过克隆创建对象  
   ↳ 核心:实现Cloneable接口,重写clone()  
   ↳ 深拷贝 vs 浅拷贝:引用类型是否独立  
   ↳ 适用场景:对象创建复杂或需批量生成  

口诀记忆:

“原型模式像复印,克隆对象省力气,
浅拷贝共享引用,深拷贝全部复制,
复杂对象用深拷,性能优化是目标!”

九、课后作业

必做 1:实现深拷贝的学生类

需求

  • Student类包含nameageAddress(地址类)
  • 地址类包含provincecity
  • 实现深拷贝,确保克隆学生的地址独立

必做 2:分析 ArrayList 的克隆

任务:查看ArrayList源码的clone()方法,说明是深拷贝还是浅拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值