河源网站设计,网站开发多少钱一个月,重庆牌联盟官网网站,.netcore网站开发设计模式之原型模式 #x1f9d0;1. 概念#x1f3af;2. 原型模式的作用#x1f4e6;3. 实现1. 定义原型接口2. 定义具体的原型类3. 定义客户端4. 结果 #x1f4f0; 4. 应用场景#x1f50d;5. 深拷贝和浅拷贝 在面向对象编程中#xff0c;设计模式是一种通用的解决方案… 设计模式之原型模式 1. 概念2. 原型模式的作用3. 实现1. 定义原型接口2. 定义具体的原型类3. 定义客户端4. 结果 4. 应用场景5. 深拷贝和浅拷贝 在面向对象编程中设计模式是一种通用的解决方案用于解决软件设计过程中常见的问题。原型模式Prototype Pattern作为创建型设计模式的一员旨在通过复制现有对象来创建新对象而非通过常规的构造函数。这种模式不仅简化了对象的创建过程而且在特定情况下还能显著提升性能。
1. 概念 原型模式允许客户端复制一个已存在的对象而不是通过常规的构造器创建一个新的实例。这种方法的主要优点在于如果对象的创建成本很高例如初始化过程复杂、需要从数据库加载大量数据等那么通过复制现有对象的方式可以有效减少资源消耗提高系统的整体性能。 Prototype抽象原型类它是声明克隆方法的接口是所有具体原型类的公共父类可以是抽象类也可以是接口甚至还可以是具体实现类。ConcretePrototype具体原型类它实现在抽象原型类中声明的克隆方法在克隆方法中返回自己的一个克隆对象。Client客户端类通过调用 clone() 方法来创建新的对象并展示了原始对象与克隆对象之间的独立性。
2. 原型模式的作用
简化对象创建通过复制现有的对象可以避免复杂的构造过程尤其是当对象的初始化需要进行大量的计算或资源分配时。提高性能对于那些创建成本高得对象使用原型模式可以显著减少内存消耗和处理时间。增加系统灵活性通过修改原型对象得属性可以快速生成不同状态的新对象这比通过继承来实现更加灵活。
3. 实现 实现原型模式的核心在于定义一个原型接口该接口包含一个用于复制自身的克隆方法。在不同的编程语言中实现方式可能会有所不同但基本思路是一致的。
1. 定义原型接口 public interface Prototype extends Cloneable {Prototype clone();
}此处的 Cloneable 接口是一个标记接口表示该类可以被克隆。 类似的标记接口还有 Serializable用于标记一个类的对象可以被序列化和反序列化。RandomAccess用于标记一个列表支持随机访问即通过索引直接访问元素吗而不是遍历。Remote用于远程方法调用标记一个类支持远程方法调用。 2. 定义具体的原型类 public class ConcretePrototype implements Prototype {private String attribute;public ConcretePrototype(String attribute) {this.attribute attribute;}Overridepublic Prototype clone() {try {return (ConcretePrototype) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError(Cannot clone., e);}}public String getAttribute() {return attribute;}public void setAttribute(String attribute) {this.attribute attribute;}}3. 定义客户端 public class Client {public static void main(String[] args) {ConcretePrototype prototype new ConcretePrototype(Initial Value);ConcretePrototype clonedPrototype (ConcretePrototype) prototype.clone();System.out.println(Original Attribute: prototype.getAttribute());System.out.println(Cloned Attribute: clonedPrototype.getAttribute());clonedPrototype.setAttribute(Modified Value);System.out.println(After Modification:);System.out.println(Original Attribute: prototype.getAttribute());System.out.println(Cloned Attribute: clonedPrototype.getAttribute());}
}4. 结果 在这个示例中ConcretePrototype 类实现了 Prototype 接口并提供了具体的 clone() 方法实现。客户端代码展示了如何通过调用 clone() 方法来创建新的对象并展示了原始对象与克隆对象之间的独立性。 4. 应用场景 对象创建成本高当对象的创建对象过程非常复杂或耗时例如需要从网络加载数据、执行复炸的算法等使用原型模式可以通过复制现有对象来节省时间和资源。避免复杂的构造过程如果对象的创建涉及到复杂的初始化步骤使用原型模式可以简化这些步骤通过复制已有对象来快速生成新的对象。动态对象创建在某些情况下程序需要根据用户的输入或其他条件动态地创建对象。原型模式提供了一种灵活的方式来满足这种需求无需预先定义所有的对象类型。实际项目当中使用原型模式实现 Cloneable 接口并重写 clone() 方法。或者编写自己的特有的原型类 Prototype 然后实现 Prototype 的 clone() 方法。
5. 深拷贝和浅拷贝 在讨论原型模式时深拷贝和浅拷贝是一个不可忽视的话题。浅拷贝只会复制对象的基本数据类型和其他对象的引用而不会递归地复制引用对象本身。相反深拷贝会递归地复制整个对象树确保新对象与原有对象完全独立。 在 Java 中 默认的 clone() 方法实现的是浅拷贝。如果需要实现深拷贝通常需要手动编写代码来处理对象中的引用类型属性。例如可以使用序列化和反序列化的方式来实现深拷贝
public class DeepClonePrototype implements Cloneable, Serializable {private transient String attribute; // 使用 transient 修饰符表示不参与序列化public DeepClonePrototype(String attribute) {this.attribute attribute;}public String getAttribute() {return this.attribute;}public void setAttribute(String attribute) {this.attribute attribute;}Overrideprotected DeepClonePrototype clone() {try {// 使用序列化和反序列化实现深拷贝ByteArrayOutputStream byteOut new ByteArrayOutputStream();ObjectOutputStream out new ObjectOutputStream(byteOut);out.writeObject(this);ByteArrayInputStream byteIn new ByteArrayInputStream(byteOut.toByteArray());ObjectInputStream in new ObjectInputStream(byteIn);return (DeepClonePrototype) in.readObject();} catch (IOException | ClassNotFoundException e) {throw new AssertionError(Cannot clone., e);}}}