创建型模式4.原型模式

news/2025/1/8 8:47:20/

创建型模式

  1. 工厂方法模式(Factory Method Pattern)
  2. 抽象工厂模式(Abstract Factory Pattern)
  3. 建造者模式(Builder Pattern)
  4. 原型模式(Prototype Pattern)
  5. 单例模式(Singleton Pattern)

原型模式(Prototype Pattern) 是一种创建型设计模式,其核心思想是通过复制已有的实例来创建新的对象,而不是通过新建对象的方式。这种模式特别适合于需要大量创建相似对象的场景,能够提高系统性能和效率。

原型模式的定义:

原型模式允许一个对象通过 复制 现有对象来创建新的对象,而无需知道如何具体实现这个对象的类。这种模式通过克隆原有对象来产生新对象,避免了直接使用 new 关键字的开销。

关键概念:

  1. Prototype(原型):原型接口或者抽象类,它定义了克隆方法,通常有一个 clone() 方法,用于复制当前对象。
  2. ConcretePrototype(具体原型):实现 Prototype 接口的具体类,通常会提供克隆自己的方法。
  3. Client(客户端):通过克隆现有对象来创建新对象的角色,客户端不需要知道如何创建对象,它只需要调用原型对象的 clone() 方法即可。

适用场景:

  • 当对象创建的成本较高时,可以使用原型模式通过复制已有对象来降低成本。
  • 当系统中有很多相似的对象,且这些对象在构建时仅有细微的不同,可以使用原型模式来简化创建过程。
  • 当对象的创建过程中需要对一些属性做个性化调整,但大体结构是相似的时,可以使用原型模式

优缺点分析:

优点:
  1. 性能优越:通过克隆已有对象创建新对象,相比传统的构造函数创建对象,性能更好,尤其是当构建对象的过程非常复杂时。
  2. 避免重复创建:如果对象创建过程复杂或开销较大,可以避免重复创建,从而提高效率。
  3. 灵活性高:客户端不需要知道如何创建对象的具体细节,只需关心对象的克隆。
缺点:
  1. 复杂性:如果对象包含复杂的成员,且某些成员不适合被浅拷贝(如包含引用类型的成员变量),可能需要额外的工作来确保深拷贝的正确实现。
  2. 内存消耗:如果使用浅拷贝,可能会出现共享资源的问题,影响对象的独立性。
  3. 维护性差:当类层次结构复杂或原型对象很难管理时,可能会增加系统的复杂度。

代码示例:

1. 使用原型模式
// Prototype接口,定义克隆方法
public interface Prototype {Prototype clone();
}// 具体的原型类
public class ConcretePrototype implements Prototype {private String name;private int age;public ConcretePrototype(String name, int age) {this.name = name;this.age = age;}// 通过构造方法初始化属性public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 实现clone方法来复制对象@Overridepublic Prototype clone() {return new ConcretePrototype(this.name, this.age);}@Overridepublic String toString() {return "ConcretePrototype{" + "name='" + name + "', age=" + age + '}';}
}

2. 客户端使用原型: 

public class PrototypeTest {public static void main(String[] args) {// 创建原型对象ConcretePrototype prototype1 = new ConcretePrototype("Alice", 30);// 通过克隆方法复制原型对象ConcretePrototype prototype2 = (ConcretePrototype) prototype1.clone();// 修改 prototype2 的属性prototype2.setName("Bob");prototype2.setAge(25);// 输出对象System.out.println("Original Object: " + prototype1);System.out.println("Cloned Object: " + prototype2);}
}
3. 输出:
Original Object: ConcretePrototype{name='Alice', age=30}
Cloned Object: ConcretePrototype{name='Bob', age=25}

在上面的示例中,ConcretePrototype 实现了 Prototype 接口,并重写了 clone() 方法来复制自己。客户端通过调用 clone() 方法,可以轻松地复制对象,而无需了解对象的构建过程。

 

深拷贝与浅拷贝

在实际应用中,浅拷贝(shallow copy)和 深拷贝(deep copy)是原型模式中的两个关键概念:

  • 浅拷贝:拷贝对象时,原始对象的字段值(基本类型数据)会被复制,而引用类型的字段(如对象)则会被复制引用,即两个对象共享相同的引用类型字段。

public class ShallowCopyExample implements Cloneable {private int value;private List<String> list;public ShallowCopyExample(int value, List<String> list) {this.value = value;this.list = list;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic String toString() {return "ShallowCopyExample{" +"value=" + value +", list=" + list +'}';}
}

深拷贝:在进行拷贝时,不仅复制原始对象本身,还会复制其引用类型的所有成员,从而创建完全独立的对象。深拷贝需要通过手动复制每个引用对象来实现。 

 

public class DeepCopyExample implements Cloneable {private int value;private List<String> list;public DeepCopyExample(int value, List<String> list) {this.value = value;this.list = new ArrayList<>(list);  // 手动复制引用类型成员}@Overrideprotected Object clone() throws CloneNotSupportedException {DeepCopyExample cloned = (DeepCopyExample) super.clone();cloned.list = new ArrayList<>(this.list);  // 深拷贝引用类型成员return cloned;}@Overridepublic String toString() {return "DeepCopyExample{" +"value=" + value +", list=" + list +'}';}
}

 

总结

原型模式是一种通过复制现有对象来创建新对象的设计模式,适用于对象创建开销较大、需要频繁创建相似对象的场景。通过实现 clone() 方法,可以轻松地复制对象。它提供了一种通过已有对象进行对象创建的方式,能有效提高系统性能并简化对象创建过程。但在使用时需要特别注意深拷贝和浅拷贝的区别。


http://www.ppmy.cn/news/1561511.html

相关文章

如何分析 Nginx 日志

分析 Nginx 日志可以帮助我们了解服务器性能、流量来源、用户行为&#xff0c;以及诊断问题&#xff08;如错误和攻击&#xff09;。以下是详细的分析方法&#xff1a; 1. 日志类型 Nginx 有两种主要日志&#xff1a; 访问日志 (Access Log)&#xff1a;记录客户端对服务器的…

Python编程实例-机器学习中的Hinge Loss编程实现

机器学习中的Hinge Loss编程实现 文章目录 机器学习中的Hinge Loss编程实现1、机器学习中的损失函数是什么?2、什么是 Hinge Loss?3、Hinge Loss如何工作?4、Hinge Loss的优缺点5、Python语言实现6、总结Hinge Loss(铰链损失)在分类任务中至关重要,广泛应用于支持向量机 …

深入解析 ReentrantReadWriteLock 和 StampedLock 的源码

引言 在高并发环境中&#xff0c;读写锁&#xff08;Read-Write Lock&#xff09;是一种非常重要的同步工具。它们允许多个线程同时进行读操作&#xff0c;但在有写操作时确保独占访问。Java 提供了 ReentrantReadWriteLock 和 StampedLock 两种读写锁实现&#xff0c;分别适用…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中&#xff0c;使用 PaddleOCR 模型时效率较慢&#xff0c;经测试每张图片的检测与识别平均耗时超过 5 秒&#xff0c;这在需要大规模自动化处理的场景中无法满足需求。为此&#xff0c;我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理&#xff0c;以提升效率。…

CV-MLLM经典论文解读|OneLLM: One Framework to Align All Modalities with Language

论文标题&#xff1a; OneLLM: One Framework to Align All Modalities with Language OneLLM&#xff1a;一个框架&#xff0c;将所有模态与语言对齐 论文链接&#xff1a; Pink: Unveiling the Power of Referential Comprehension for Multi-modal LLMs论文下载 论文作…

基于SPring Boot的高校就业招聘系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Ubuntu 、Debian(Kali) 、Centos 命令区别(三剑客)

1、安装 Ubuntu从软件源 安装&#xff1a; apt-get install XXX (包名)Debian(Kali)从软件源 安装&#xff1a; apt-get install xxx (包名) CentOS从软件源 安装&#xff1a; yum install XXX XXX (包名) 2、包的信息 Debian(Kali)从软件源 安装&#xff1a; apt-cache sea…