设计模式之原型模式

embedded/2024/9/22 14:33:22/

1、简单介绍

        原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新对象,而不是通过调用类的构造函数来创建新实例。这种模式适用于需要快速复制大量相同或相似对象,或者创建对象需要消耗大量资源、执行复杂初始化过程,或者需要保护原始对象的状态不受修改等情况。

2、主要角色

  • Prototype(原型):定义一个克隆自身的接口,通常包含一个clone()方法。
  • ConcretePrototype(具体原型):实现原型接口,提供克隆自身的具体实现。具体原型类通常包含需要复制的属性和方法。

3、使用场景

  1. 资源消耗大的对象:当创建对象需要消耗大量资源(如数据库查询、网络通信、复杂计算等)时,使用原型模式可以避免重复创建相同的对象,提高性能。
  2. 初始化过程复杂的对象:如果对象的初始化过程涉及多个步骤、依赖关系复杂,使用原型模式可以简化对象的创建过程,只需克隆已初始化好的原型即可。
  3. 保护原始对象状态:在某些场景下,可能需要复制一个对象而不影响原始对象的状态。原型模式可以创建对象的副本,避免直接修改原始对象。
  4. 动态生成对象:在运行时根据用户需求动态生成新对象,或者需要动态地改变对象的某些属性,可以利用原型模式快速复制并调整对象。

4、Java代码示例

假设我们有一个Employee类,包含姓名、职位、薪水等属性,我们使用原型模式来复制员工对象:

import java.util.Date;public class Employee implements Cloneable {private String name;private String position;private double salary;private Date hireDate;public Employee(String name, String position, double salary, Date hireDate) {this.name = name;this.position = position;this.salary = salary;this.hireDate = (Date) hireDate.clone(); // 防止原始日期对象被修改}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public Date getHireDate() {return (Date) hireDate.clone(); // 防止原始日期对象被修改}public void setHireDate(Date hireDate) {this.hireDate = (Date) hireDate.clone(); // 防止原始日期对象被修改}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}// 客户端代码
public class Client {public static void main(String[] args) {try {Employee original = new Employee("John Doe", "Manager", 50000, new Date());Employee copy = (Employee) original.clone();copy.setName("Jane Doe");copy.setSalary(60000);System.out.println("Original employee: " + original);System.out.println("Cloned employee: " + copy);} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}

5、使用过程中可能遇到的问题

1、深拷贝与浅拷贝:默认的clone()方法实现的是浅拷贝,即只复制对象本身,而不复制其引用的对象。如果对象包含引用类型属性(如数组、集合或其他对象),浅拷贝可能导致原始对象和克隆对象之间的数据共享,修改其中一个对象会影响另一个。对于包含复杂数据结构的对象,需要实现深度拷贝。

2、Cloneable接口的局限性:Java的Cloneable接口是标记接口,没有提供克隆方法。如果忘记实现Cloneable接口或重写clone()方法,调用clone()会抛出CloneNotSupportedException。此外,clone()方法是protected的,需要进行类型转换。

3、对象创建逻辑的分散:如果原型模式与工厂模式、单例模式等混合使用,可能会导致对象创建逻辑分散在多个地方,不易管理。

4、滥用原型模式:不是所有对象都适合使用原型模式。对于简单对象或创建成本较低的对象,直接使用构造函数或工厂方法创建更直观、高效。

6、遇到问题的解决方案

1、深拷贝与浅拷贝解决方案:重写clone()方法,实现深度拷贝。对于引用类型属性,也需要调用其clone()方法(如果支持)或手动复制其内容。对于不可变对象(如StringInteger等),可以直接引用,无需复制。

2、Cloneable接口的局限性解决方案:确保具体原型类实现Cloneable接口并重写clone()方法。在客户端代码中捕获CloneNotSupportedException,并提供相应的错误处理或提示。为避免类型转换,可以考虑提供一个公共的克隆方法,如createClone()

3、对象创建逻辑的分散解决方案:明确区分各种模式的职责,尽量保持对象创建逻辑的集中。可以考虑使用工厂方法返回原型对象,或将原型对象的创建与管理交给单例模式的实例。

4、滥用原型模式解决方案:根据对象的复杂度、创建成本等因素,合理选择创建对象的方式。对于简单对象或创建成本较低的对象,优先考虑构造函数或工厂方法。

注意:原型模式通过复制现有对象来创建新对象,适用于资源消耗大、初始化过程复杂、需要保护原始对象状态或动态生成对象的场景。在使用过程中,需要注意深拷贝与浅拷贝的区别、Cloneable接口的局限性、对象创建逻辑的分散以及模式的适用性等问题,并采取相应的解决方案。


http://www.ppmy.cn/embedded/9827.html

相关文章

OpenHarmony实战开发-文件上传下载性能提升指导。

概述 在开发应用时,要实现高效的客户端跟服务器之间数据交换,文件传输的性能是至关重要的。一个数据交换性能较低的应用会导致其在加载过程中耗费较长时间,在很多的场景造成页面卡顿,极大的影响了用户体验。相反,一个…

网卡接收数据的关键过程

网卡接收数据的关键过程 网卡中断处理网络软中断处理协议栈处理传输层处理 Linux内核tracers的实现原理与应用 前年ftrace for io /去年ftrace for mm/今年ftrace for network.今年ftrace也被深度定制加强。 在这篇文章中,我们将深入探讨网卡接收数据的完整过程,了解数据是如何…

春藤实业启动SAP S/4HANA Cloud Public Edition项目,与工博科技携手数字化转型之路

3月11日,广东省春藤实业有限公司(以下简称“春藤实业”)SAP S/4HANA Cloud Public Edition(以下简称“SAP ERP公有云”)项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换(Vulnerability Exploitability eXchange,简称VEX)是一个信息安全领域的标准,旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF),由美国政府开发的漏洞利用交换(VEX)使供应商和用…

Hadoop 启动!

​2024/4/22 上个星期我们已经完成了Hadoop的安装及配置文件的修改 下面 我们将namenode进行一下初始化 hdfs namenode -format (创建文件存储目录:账本目录namenode datanode的目录) 我们在配置时 这就是用来设置账本目录的 我们做完格式化后 tmp目录就出现了 …

Unity类银河恶魔城学习记录13-1 p142 Save system源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

图像哈希:Global+Local

文章信息 作者:梁小平,唐振军期刊:ACM Trans. Multimedia Comput. Commun. Appl(三区)题目:Robust Hashing via Global and Local Invariant Features for Image Copy Detection 目的、实验步骤及结论 目…

CSS中的层叠上下文

HTML 文档中的三维概念 平时我们从设备终端看到的 HTML 文档都是一个平面的,事实上 HTML 文档中的元素却是存在于三个维度中。除了大家熟悉的平面画布中的 x 轴和 y 轴,还有控制第三维度的 z 轴。 其中 x 轴通常用来表示水平位置,y 轴来表示…