第九章 简历复印—原型模式

本文深入探讨了Java中的原型模式及其应用,解释了如何通过重写clone方法和实现Cloneable接口来实现对象的克隆。重点强调了原型模式的特点,包括创建对象的灵活性、动态获取对象状态的能力、以及性能提升的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人笔记,不具备参考价值

定义

用原型实例指定创建对象的种类,并通过拷贝这些原型来创建新对象。

实现类图



由于克隆对象是非常常见的,java中已经为我们内置好了这种功能。我们只需要重写clone方法,并让我们的类实现Cloneable接口即可,如果不实现Cloneable接口会在调用clone()方法时抱出CloneNotSupportedException。

总结一些原型模式的几个特点:
  1. 从一个对象可以创建另一个对象,而不需要知道任何创建细节。
  2. 可以动态的获得对象运行时的状态,根据当前的状态创建一个对象
  3. 克隆出的对象和原型对象以及其它克隆出的对象互不影响,一个改变不影响另一个(这句话成立的条件是深复制)。
  4. 性能得到提高。由于创建对象不通过new,而是调用clone()方法,就可以避免执行构造函数时一些初始化操作时间很长,很消耗性能的操作。


<think>好的,用户现在问的问题是:“原型模式是23种设计模式之一吗?”首先,我需要确认用户对这个问题的理解程度。可能用户之前了解过设计模式的分,或者是在学习过程中遇到了这个问题,需要确认原型模式的位置。 先回想一下设计模式的分。根据GoF的经典著作《设计模式:可复用面向对象软件的基础》,设计模式分为创建型、结构型和行为型三原型模式属于创建型模式,这点我记得没错。所以答案应该是肯定的,原型模式确实是23种之一。 接下来,用户之前的提问是关于Spring中的prototype作用域是否属于原型模式,现在这个问题是在确认原型模式本身是否属于23种设计模式之一。可能用户在学习过程中遇到了混淆,或者需要巩固基础知识。需要明确回答,并给出清晰的分,帮助用户建立知识体系。 需要检查是否有常见的误解。比如,是否有人会误以为原型模式不属于23种之一,或者与其他模式混淆。比如,有时候单例模式、工厂方法模式比较常见,而原型模式可能较少被提及,用户可能不确定它的存在。 在回答时,应该引用权威资料,比如GoF的书籍,来增强可信度。同时,可以举一个简单的例子,说明原型模式的用途,比如通过克隆来创建对象,避免重复初始化资源。例如,游戏中的敌人角色生成,或者需要大量相似对象时使用原型模式。 另外,需要将原型模式与其他创建型模式对比,比如工厂模式和建造者模式,说明它们的区别。比如,工厂模式通过子来决定创建的对象,而原型模式通过复制原型实例来创建新对象。 还要注意回答的结构,先明确回答问题,然后详细解释,最后举例说明,这样用户更容易理解。同时,使用通俗易懂的语言,避免过于专业的术语,让不同层次的读者都能明白。 总结下来,回答的结构应该是: 1. 直接回答“是”,属于23种设计模式之一。 2. 说明属于创建型模式。 3. 解释原型模式的定义和用途。 4. 提供一个简单的例子,比如简历克隆。 5. 对比其他创建型模式,突出其特点。 6. 引用GoF的权威性,增强回答的可信度。 需要确保回答准确无误,并且覆盖用户可能关心的点,比如为什么它被归为创建型,实际应用场景等。这样用户在得到答案的同时,也能加深对原型模式的理解,避免之前的混淆,比如与Spring中的prototype作用域的区别。</think>**是的,原型模式(Prototype Pattern)正是23种经典设计模式之一!** 它属于**创建型设计模式**,与单例模式、工厂模式等并列。下面用最直观的方式帮你理解: --- ### 一、一句话说透原型模式 **核心思想**:**“复印机模式”** —— 需要新对象时,直接复制一个现成的模板对象,而不是从头`new`一个。 --- ### 二、举个🌰快速理解 #### 场景:批量生成游戏怪物 假设游戏中要生成100个**相同属性的骷髅兵**: 1. **传统方式**(用`new`): ```java for (int i = 0; i < 100; i++) { Skeleton skeleton = new Skeleton(); skeleton.setWeapon("骨刀"); // 每次都要重复初始化属性 skeleton.setHP(100); } ``` **痛点**:重复初始化代码,效率低。 2. **原型模式**(用`clone`): ```java // 先创建一个原型(模板) Skeleton prototype = new Skeleton(); prototype.setWeapon("骨刀"); prototype.setHP(100); // 后续直接复制 for (int i = 0; i < 100; i++) { Skeleton skeleton = prototype.clone(); // 一键复制 } ``` **优势**:避免重复初始化,提升性能。 --- ### 三、技术实现关键点 1. **实现`Cloneable`接口**(Java语言特性): ```java class Skeleton implements Cloneable { private String weapon; private int HP; @Override public Skeleton clone() { try { return (Skeleton) super.clone(); // 浅拷贝 } catch (CloneNotSupportedException e) { throw new AssertionError(); } } } ``` 2. **深浅拷贝问题**: - **浅拷贝**:复制基本型字段,引用型字段共享地址(默认`clone()`行为) - **深拷贝**:引用型字段也创建新对象(需要手动实现) --- ### 四、对比其他创建型模式 | 模式 | 特点 | |---------------|--------------------------------------------------------------------| | **原型模式** | 通过复制已有对象创建新对象(适合创建成本高的对象) | | **工厂模式** | 通过子决定创建哪种对象(隐藏创建逻辑) | | **建造者模式** | 分步骤构建复杂对象(适合属性多且有校验的场景) | --- ### 五、实际应用场景 1. **游戏开发**:快速生成大量相似NPC/怪物 2. **配置对象**:复制已加载好的复杂配置模板 3. **数据库连接**:复用初始化好的连接配置 4. **撤销操作**:保存对象历史状态(通过克隆实现快照) --- ### 六、权威背书 原型模式最早出现在1994年的**《设计模式:可复用面向对象软件的基础》**(GoF经典著作),是23种设计模式中**创建型模式**的5大成员之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值