JAVA重点基础、进阶知识及易错点总结(32)设计模式(建造者、原型)

张开发
2026/4/21 3:58:49 15 分钟阅读

分享文章

JAVA重点基础、进阶知识及易错点总结(32)设计模式(建造者、原型)
Java 巩固进阶 · 第 32 天主题设计模式建造者、原型—— 复杂对象创建方案 进度概览继昨天的单例/工厂模式之后今天学习另外两种创建型设计模式。建造者模式解决复杂对象构建原型模式解决对象克隆复制两者在实际开发中应用广泛。 核心价值构建优雅建造者模式用链式调用替代伸缩构造器代码可读性提升 10 倍。克隆高效原型模式避免重复初始化适合模板复制场景如简历克隆、订单复制。框架关联理解 StringBuilder、AlertDialog、Spring Bean 克隆的底层思想。面试加分深浅克隆区别、Builder 模式适用场景是高级开发常考题。一、建造者模式Builder链式构建复杂对象 1. 为什么需要建造者模式// ❌ 问题伸缩构造器反模式参数多、易出错、可读性差publicclassComputer{// 10 个参数调用时根本不知道每个参数含义publicComputer(Stringcpu,Stringram,Stringdisk,Stringgpu,Stringmotherboard,Stringpower,Stringcase_,Stringcooling,Stringmonitor,Stringkeyboard){...}}// 调用newComputer(i7,16G,512G,RTX3060,null,null,ATX,null,null,null);// 哪个是 null参数顺序记错怎么办// ✅ 解决建造者模式链式调用语义清晰ComputercomputernewComputer.Builder().cpu(i7).ram(16G).disk(512G).gpu(RTX3060).case_(ATX).build();// 最后一步构建中间参数顺序随意未设置用默认值2. 标准实现模板⭐ 背下来publicclassComputer{// 1. 私有字段privatefinalStringcpu;privatefinalStringram;privatefinalStringdisk;privatefinalStringgpu;// ... 其他字段// 2. 私有构造器只允许 Builder 访问privateComputer(Builderbuilder){this.cpubuilder.cpu;this.rambuilder.ram;// ... 赋值}// 3. 静态内部类 BuilderpublicstaticclassBuilder{// 与外部类相同的字段privateStringcpui3;// 默认值privateStringram8G;privateStringdisk256G;privateStringgpu集成显卡;// 链式设置方法返回 thispublicBuildercpu(Stringcpu){this.cpucpu;returnthis;}publicBuilderram(Stringram){this.ramram;returnthis;}publicBuilderdisk(Stringdisk){this.diskdisk;returnthis;}publicBuildergpu(Stringgpu){this.gpugpu;returnthis;}// 构建方法校验 创建publicComputerbuild(){// 可选参数校验if(cpunull)thrownewIllegalArgumentException(CPU 不能为空);returnnewComputer(this);}}// getter 方法省略}3. 关键细节解析设计点原因注意事项静态内部类避免外部类膨胀隔离构建逻辑Builder 可访问外部类私有字段字段 final保证对象不可变线程安全构建完成后不能修改链式返回 this支持流畅调用每个 setter 必须return thisbuild() 校验确保对象状态合法在构建最后一步集中校验生产实践Lombok 的Builder注解可自动生成 Builder 代码但建议手动写一次理解原理后再用注解二、原型模式Prototype克隆对象的高效方案 1. 为什么需要原型模式 场景创建对象成本高如查数据库初始化、复杂计算 ❌ 问题每次 new 都要重复初始化浪费资源 ✅ 解决克隆已有对象原型快速复制 局部修改2. Cloneable 接口与 clone() 方法// ✅ 标准实现实现 Cloneable 重写 clone()publicclassResumeimplementsCloneable{privateStringname;privateStringexperience;// 工作经历可变对象OverrideprotectedObjectclone()throwsCloneNotSupportedException{returnsuper.clone();// 浅克隆调用 Object.clone()}}// 使用Resumer1newResume();r1.setName(Alice);Resumer2(Resume)r1.clone();// 快速复制3. ⚠️ 浅克隆 vs 深克隆⭐ 面试高频// 浅克隆问题只克隆对象本身内部引用对象共享Resumer1newResume();r1.setExperience(newExperience(2020-2024,Java 开发));Resumer2(Resume)r1.clone();r2.getExperience().setCompany(New Corp);// 修改 r2 的经历System.out.println(r1.getExperience().getCompany());// ❌ r1 也被改了// ✅ 深克隆方案 1手动克隆引用字段OverrideprotectedObjectclone()throwsCloneNotSupportedException{Resumecloned(Resume)super.clone();// 手动克隆可变字段cloned.experience(Experience)this.experience.clone();returncloned;}// ✅ 深克隆方案 2序列化通用但性能略低publicResumedeepClone(){// 1. 序列化到字节数组// 2. 反序列化为新对象// 所有引用字段自动克隆无需手动处理}4. 深浅克隆对比表特性浅克隆深克隆实现方式super.clone()手动克隆 / 序列化引用字段共享同一对象克隆新对象性能⚡ 快内存拷贝 略慢递归/序列化适用场景对象无引用字段 / 引用不可变对象含可变引用字段代码复杂度✅ 简单⚠️ 需处理每个引用字段记忆口诀“浅克隆只拷贝外壳深克隆连内脏一起复制”三、 今日实战任务模式综合应用任务 1用建造者模式创建电脑配置/** * 要求 * 1. 定义 Computer 类包含 8 个字段cpu/ram/disk/gpu/主板/电源/机箱/散热 * 2. 实现 Builder 内部类支持链式调用 * 3. 设置默认值build() 时校验关键字段如 cpu 不能为空 * 4. 测试用不同参数构建 3 台电脑打印配置 * * 挑战 * - 添加构建报告功能build() 时输出配置摘要 * - 思考如果字段增加到 20 个Builder 模式的优势是否更明显 */任务 2用原型模式实现简历克隆/** * 业务场景求职者投递不同公司简历内容相似但公司名/职位不同 * * 要求 * 1. 定义 Resume 类姓名/经历列表实现 Cloneable * 2. 实现浅克隆测试修改克隆对象的经历是否影响原对象 * 3. 实现深克隆手动克隆经历列表验证隔离性 * 4. 对比new 新简历 vs 克隆简历的耗时模拟经历初始化耗时 * * 提示 * - 经历列表用 ArrayList注意集合的克隆 * - 深克隆可用序列化ObjectOutputStream / ObjectInputStream */任务 3建造者 原型组合实战/** * 业务场景订单系统 - 复制历史订单生成新订单 * * 要求 * 1. 用建造者模式创建 Order 对象商品列表/收货地址/支付方式 * 2. 为 Order 实现 clone() 方法深克隆商品列表 * 3. 场景用户再来一单克隆旧订单 → 修改收货地址 → 提交 * 4. 验证新旧订单的商品列表是否独立修改一个不影响另一个 * * 思考 * - 为什么订单克隆要用深克隆商品可能后续修改价格/库存 * - 如果商品对象本身很大克隆是否划算空间换时间 */任务 4对比实验Builder vs 传统构造器/** * 要求 * 1. 用传统构造器 用 Builder 分别创建同一个复杂对象 * 2. 统计代码行数、可读性、维护成本 * 3. 模拟新增一个可选字段对比两种方案的修改范围 * * 预期结论 * - Builder 代码略多但调用方代码极简 * - 新增字段时Builder 只需加一个 setter调用方无需修改 * - 符合开闭原则对扩展开放对修改关闭 */ 第 32 天 · 核心总结极简背诵版建造者模式核心// 静态内部类 链式 setter build() 构建newBuilder().cpu(i7).ram(16G).build();// ✅ 适用参数多、有默认值、需校验的复杂对象原型模式核心// 实现 Cloneable 重写 clone()Objectcloneobj.clone();// ⚠️ 默认浅克隆引用字段需手动深克隆深浅克隆区别浅克隆只拷贝对象本身引用字段共享 深克隆递归拷贝所有引用字段完全独立 选择可变引用用深克隆不可变/无引用用浅克隆生产建议✅ 复杂对象构建优先 Builder 模式或 Lombok Builder✅ 模板复制场景用原型模式如配置克隆、订单复制❌ 避免滥用 clone()优先用构造器 工厂更清晰明天预告设计模式代理、装饰器—— 增强对象功能的两种套路静态代理 vs 动态代理JDK/CGLIB装饰器模式动态增强对象功能如 IO 缓冲流代理与装饰器的区别意图不同实战用动态代理为 Service 添加日志/事务功能准备好了吗明天我们学习对象增强的两种经典方案 ✨

更多文章