设计模式——原型模式

embedded/2024/12/22 12:20:31/

设计模式——原型模式

目录

介绍

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新的对象,而不是通过 new 操作符来创建对象。原型模式的核心思想是通过“复制”已有对象来创建新对象,而不是从头开始构建。这样能够提高系统的性能,尤其是在需要创建多个相似对象时,可以通过克隆现有对象来减少创建的成本。

实现

原型模式的结构

  1. 抽象原型类(Prototype):定义一个接口,声明克隆自身的方法,一般是 clone() 方法。
  2. 具体原型类(ConcretePrototype):实现 Prototype 接口并且提供克隆自身的功能。
  3. 客户端(Client):使用 Prototype 来获取新对象,而无需直接创建对象。

工作流程

  1. 创建原型:首先创建一个“原型”对象,这是你希望克隆的对象。
  2. 克隆原型:通过调用 clone() 方法,创建一个原型的副本。
  3. 使用克隆对象:获得克隆对象并进行操作,原型模式会保证新对象与原对象的相似性。

示例代码:

Java中的Object类中提供了 clone() 方法来实现浅克隆。

实现了Cloneable接口的子实现类就是具体的原型类

java">public class Model implements Cloneable {public Model() {System.out.println("具体的原型对象创建完成!");}@Overrideprotected Model clone() throws CloneNotSupportedException {System.out.println("具体原型复制成功!");return (Model) super.clone();}
}

测试代码:

java">public static void main(String[] args) throws CloneNotSupportedException {Model model=new Model();Model clone = model.clone();System.out.println(model==clone);
}

看到输出结果为

image-20241218160456276

可见,其底层并不是直接通过调用构造函数来实现对象的克隆

原型模式的优缺点

优点

  1. 性能优化:在需要大量创建相似对象的情况下,原型模式可以避免重复创建对象,减少性能开销。
  2. 避免重复代码:通过克隆原型对象,可以避免重复的代码,因为不需要重新实例化对象。
  3. 灵活性原型模式让你可以根据已有对象的状态来创建新对象,而不需要依赖于复杂的构造函数。

缺点

  1. 复杂性增加:如果对象的构建过程过于复杂,或者对象之间存在较多的依赖关系,使用原型模式可能导致代码结构复杂化。
  2. 克隆深度问题:如果对象中包含引用类型的成员变量,简单的浅拷贝(clone() 方法通常是浅拷贝)可能会导致引用共享问题,从而影响系统的稳定性。
  3. 依赖于 clone() 方法:要求所有类都实现 clone() 方法,这在某些情况下可能不方便。

补充一下 浅拷贝与深拷贝

浅拷贝:拷贝对象时,原对象和新对象中的引用类型成员变量指向同一个内存地址(引用共享)

深拷贝:拷贝对象时,原对象和新对象中的引用类型成员变量指向不同的内存地址,即完全复制对象的所有成员

简单解释一下:

浅拷贝,对于基本数据类型直接进行拷贝,而对于引用数据类型,直接拷贝原来该引用数据类型对应对象的内存地址,并不是重新创建一个新对象
深拷贝,对于基本数据类型直接进行拷贝,而对于引用数据类型,重新开辟内存空间并实例化一个新对象,总的来说深拷贝就是完全复制对象的所有成员

原型模式使用场景

原型模式适用于以下情况:

  1. 创建对象代价较大:当创建一个对象非常复杂或者消耗大量资源时,使用已有的对象进行克隆可以大大提高效率。
  2. 需要大量相似对象:如果需要创建的对象有很多相似的部分,可以通过原型模式来进行克隆。
  3. 对象初始化时带有复杂状态:某些对象初始化时可能需要进行繁杂的计算或从外部资源加载数据,原型模式可以通过克隆来避免重复的初始化过程。

总结

原型模式通过提供一种原型实例,并通过克隆来创建新对象,避免了多次创建相似对象的过程。它能够提高系统的性能,尤其是在对象创建成本较高或相似对象较多时。

不过在使用的时候一定要注意浅克隆深克隆的问题。


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

相关文章

String.prototype.padStart() 方法来实现日不足两位时补充零

你可以使用 String.prototype.padStart() 方法来实现日不足两位时补充零,这样代码更简洁。padStart() 会在字符串的前面填充指定的字符,直到字符串达到给定的长度。对于你的需求,padStart(2, 0) 会将 day 补充成两位数(如果 day 是…

在 Ubuntu 上安装 Nginx 的详细指南

在Ubuntu系统中从源码安装Nginx可以让您自定义Nginx的编译选项和模块,以满足特定需求。以下是详细的步骤指南: 前提条件 更新系统包列表 sudo apt update sudo apt upgrade -y安装必要的依赖包 sudo apt install -y build-essential libpcre3 libpcre3-…

抽象之诗:C++模板的灵魂与边界

引言 在计算机科学的浩瀚长河中,C模板如同一颗璀璨的星辰,以其独特的泛型编程方式为程序设计注入了灵魂。它是抽象的艺术,是类型的舞蹈,是效率与灵活性的交响乐。模板不仅是一种技术工具,更是一种哲学思考&#xff0c…

电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据

电商数据采集可以通过多种方式完成,其中包括人工采集、使用电商平台提供的API接口、以及利用爬虫技术等自动化工具。以下是一些常用的电商数据采集方法: 人工采集:人工采集主要是通过基本的“复制粘贴”的方式在电商平台上进行数据的收集&am…

在 Ubuntu 上安装 Muduo 网络库的详细指南

在 Ubuntu 上安装 Muduo 网络库的详细指南 首先一份好的安装教程是非常重要的 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 像这篇文章就和shit一样,安装到2%一定会卡住,如果你不幸用了这个那真是遭老罪了 环境&#xf…

分布式专题(6)之MongoDB复制(副本)集实战及其原理分析

一、MongoDB复制集结构 在生产环境中,不建议使用单机版的MongoDB服务器。原因如下: 单机版的MongoDB无法保证可靠性,一旦进程发生故障或是服务器宕机,业务将直接不可用。一旦服务器上的磁盘损坏,数据会直接丢失&#x…

AdminJS - 现代化的 Node.js 管理面板框架详解

AdminJS - 现代化的 Node.js 管理面板框架详解 什么是 AdminJS? AdminJS 是一个自动化的管理面板框架,专为 Node.js 应用程序设计。它可以让开发者快速构建功能强大的管理后台界面,而无需编写大量重复的代码。 主要特点 自动 CRUD 操作 自动生成增删…

基于Spring Boot的医院质控上报系统

一、系统背景与意义 医院质控上报系统旨在通过信息化手段,实现医院质量控制的标准化、流程化和自动化管理。该系统能够帮助医院实时监控医疗质量数据,及时发现和处理潜在的质量问题,从而确保医疗服务的安全性和有效性。同时,系统…