编程自学指南:java程序设计开发,Java 原型设计模式
一、课程信息
学习目标
- 理解原型模式的核心思想:通过复制现有对象创建新对象
- 掌握
Cloneable
接口与clone()
方法的使用 - 能区分深拷贝与浅拷贝,避免对象共享问题
- 运用原型模式优化对象创建性能,减少重复代码
二、课程导入:生活中的复制
🌰 场景 1:简历批量修改
- 有 100 份简历,大部分内容相同,仅姓名和电话不同
- 传统方式:每份简历单独创建,重复代码多
- 原型方式:复制基础简历,修改差异部分
三、核心概念与角色
1. 模式定义
通过复制(克隆)现有对象来创建新对象,避免直接实例化。
核心:以现有对象为模板(原型),快速创建相似对象
2. 核心角色
角色名称 | 作用 | 案例类比 |
---|---|---|
原型类 | 实现克隆接口,提供克隆方法 | Resume 类(实现 Cloneable) |
具体原型 | 实现具体克隆逻辑,处理深拷贝 / 浅拷贝 | TechResume 、MarketingResume |
四、实现步骤与案例
🔧 案例 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(); // 浅拷贝(基本类型数组)
六、适用场景与优缺点
✅ 优点
- 性能优化:避免复杂对象的重复初始化(如数据库连接、网络请求)
- 简化创建:无需知道对象创建细节,直接复制现有对象
⚠️ 缺点
- 深拷贝实现复杂:对象包含多层引用时,需递归克隆
- 破坏封装:
clone()
方法是protected
,需暴露给客户端
🔥 适用场景
- 对象创建成本高:如游戏角色(包含大量装备、技能)
- 批量生成相似对象:如电商订单模板、报表模板
七、课堂练习
练习 1:游戏角色克隆
需求:
- 定义
GameCharacter
类,包含name
、level
、Equipment
(装备类) - 实现深拷贝,确保克隆角色的装备独立
练习 2:优化简历克隆
任务:将案例 1 的浅拷贝改为深拷贝,确保技能数组独立
八、课程总结
知识图谱:
原型模式 → 通过克隆创建对象
↳ 核心:实现Cloneable接口,重写clone()
↳ 深拷贝 vs 浅拷贝:引用类型是否独立
↳ 适用场景:对象创建复杂或需批量生成
口诀记忆:
“原型模式像复印,克隆对象省力气,
浅拷贝共享引用,深拷贝全部复制,
复杂对象用深拷,性能优化是目标!”
九、课后作业
必做 1:实现深拷贝的学生类
需求:
Student
类包含name
、age
、Address
(地址类)- 地址类包含
province
、city
- 实现深拷贝,确保克隆学生的地址独立
必做 2:分析 ArrayList 的克隆
任务:查看ArrayList
源码的clone()
方法,说明是深拷贝还是浅拷贝