当前位置: 首页 > news >正文

Java 设计模式:原型模式详解

Java 设计模式:原型模式详解

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而无需依赖其具体类。这种模式特别适合创建复杂对象或需要频繁创建相似对象的场景。本文将详细介绍原型模式的定义、实现方式及其在 Java 中的应用。

1. 什么是原型模式?

原型模式的核心思想是:通过克隆已有对象(原型)来生成新对象,而不是通过构造函数重新创建。它利用对象的复制机制,提高创建效率,并支持动态扩展。

模式结构

  • 抽象原型(Prototype):定义克隆自身的接口,通常是一个抽象类或接口。
  • 具体原型(Concrete Prototype):实现克隆方法,生成对象的副本。
  • 客户端(Client):使用原型对象,通过克隆创建新实例。

2. 原型模式的实现方式

Java 中,原型模式通常通过实现 Cloneable 接口并重写 clone() 方法来实现。以下是一个简单的示例:复制一个简历对象。

2.1 定义原型接口

Java 提供了内置的 Cloneable 接口,我们直接使用它:

public interface Cloneable {// 标记接口,无方法
}

2.2 实现具体原型

定义一个 Resume 类,表示简历,支持浅克隆和深克隆。

浅克隆实现
public class Resume implements Cloneable {private String name;private int age;private String company; // 工作经历public Resume(String name, int age, String company) {this.name = name;this.age = age;this.company = company;}//  setters and getterspublic void setName(String name) { this.name = name; }public void setAge(int age) { this.age = age; }public void setCompany(String company) { this.company = company; }public String getName() { return name; }public int getAge() { return age; }public String getCompany() { return company; }@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 浅克隆}@Overridepublic String toString() {return "Resume{name='" + name + "', age=" + age + ", company='" + company + "'}";}
}
深克隆实现

如果对象包含引用类型(如对象或集合),需要实现深克隆以避免共享引用:

public class Resume implements Cloneable {private String name;private int age;private WorkExperience workExperience; // 复杂对象public Resume(String name, int age, WorkExperience workExperience) {this.name = name;this.age = age;this.workExperience = workExperience;}// setters and getterspublic void setName(String name) { this.name = name; }public void setAge(int age) { this.age = age; }public void setWorkExperience(WorkExperience workExperience) { this.workExperience = workExperience; }public WorkExperience getWorkExperience() { return workExperience; }@Overrideprotected Object clone() throws CloneNotSupportedException {// 深克隆Resume cloned = (Resume) super.clone();cloned.workExperience = (WorkExperience) workExperience.clone(); // 克隆引用对象return cloned;}@Overridepublic String toString() {return "Resume{name='" + name + "', age=" + age + ", workExperience=" + workExperience + "}";}
}// 工作经历类,也需实现 Cloneable
public class WorkExperience implements Cloneable {private String company;private String duration;public WorkExperience(String company, String duration) {this.company = company;this.duration = duration;}public void setCompany(String company) { this.company = company; }public void setDuration(String duration) { this.duration = duration; }@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic String toString() {return "WorkExperience{company='" + company + "', duration='" + duration + "'}";}
}

2.3 客户端使用

浅克隆测试
public class Client {public static void main(String[] args) throws CloneNotSupportedException {Resume resume1 = new Resume("张三", 25, "公司A");Resume resume2 = (Resume) resume1.clone();// 修改副本resume2.setCompany("公司B");System.out.println("原始对象: " + resume1);System.out.println("克隆对象: " + resume2);}
}

输出结果

原始对象: Resume{name='张三', age=25, company='公司A'}
克隆对象: Resume{name='张三', age=25, company='公司B'}
深克隆测试
public class Client {public static void main(String[] args) throws CloneNotSupportedException {WorkExperience work = new WorkExperience("公司A", "2020-2022");Resume resume1 = new Resume("张三", 25, work);Resume resume2 = (Resume) resume1.clone();// 修改副本的引用对象resume2.getWorkExperience().setCompany("公司B");System.out.println("原始对象: " + resume1);System.out.println("克隆对象: " + resume2);}
}

输出结果

原始对象: Resume{name='张三', age=25, workExperience=WorkExperience{company='公司A', duration='2020-2022'}}
克隆对象: Resume{name='张三', age=25, workExperience=WorkExperience{company='公司B', duration='2020-2022'}}

3. 浅克隆与深克隆的区别

  • 浅克隆:仅复制对象的基本类型字段,引用类型字段仍指向原对象。
  • 深克隆:递归复制所有字段,包括引用类型,确保新对象完全独立。

4. 原型模式的优缺点

优点

  1. 高效创建:避免复杂的构造过程,直接复制对象。
  2. 动态扩展:运行时通过克隆创建新实例,灵活性高。
  3. 简化创建:适用于初始化成本高的对象。

缺点

  1. 实现复杂:深克隆需要处理所有引用类型,代码量增加。
  2. 克隆限制:依赖 Cloneable 接口,可能不适用于所有类。

5. 实际应用场景

  • Java 中的 Object.clone():Java 提供的基础克隆机制。
  • 对象池:如线程池或连接池,通过克隆重用对象。
  • 配置复制:复制复杂的配置对象并稍作修改。

示例:Java 中的 ArrayList

ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "B"));
ArrayList<String> list2 = (ArrayList<String>) list1.clone();
list2.add("C");
System.out.println(list1); // [A, B]
System.out.println(list2); // [A, B, C]

6. 总结

原型模式通过对象的复制机制,提供了一种高效创建相似对象的方式。浅克隆适用于简单对象,深克隆则适合复杂对象结构。在 Java 中,借助 Cloneable 接口和 clone() 方法,可以轻松实现原型模式。掌握这一模式,能在对象创建成本高或需要动态复制的场景中发挥重要作用。

希望这篇博文能帮助你理解原型模式的精髓!如果有其他设计模式相关问题,欢迎留言讨论。

相关文章:

Java 设计模式:原型模式详解

Java 设计模式&#xff1a;原型模式详解 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而无需依赖其具体类。这种模式特别适合创建复杂对象或需要频繁创建相似对象的场景。本文将详细介绍原…...

NLP高频面试题(三十七)——大模型训练和推理的显存估计

在训练和推理大型语言模型时,显存(GPU 内存)的需求是一个关键考虑因素。准确估计这些需求有助于选择合适的硬件配置,确保模型高效运行。 推理阶段的显存需求 在推理过程中,显存主要用于存储模型权重和中间激活值。模型权重的显存需求可以通过以下公式估算: 模型权重…...

PHP 阿里云oss 使用指南

1.介绍 把图片放到阿里云上的空间上&#xff0c;可以使用cdn加速。 可以在程序里直接调用 要使用阿里云 oss sdk &#xff0c;请先到阿里云下载 或用 copmposer 安装 相关链接&#xff1a; 安装OSS PHP SDK_对象存储(OSS)-阿里云帮助中心 composer require aliyuncs/oss…...

leetcode_面试题 02.07. 链表相交_java

面试题 02.07. 链表相交https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/ 1、题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c…...

LeetCode 3375.使数组的值全部为 K 的最少操作次数:O(1)空间——排序+一次遍历

【LetMeFly】3375.使数组的值全部为 K 的最少操作次数&#xff1a;O(1)空间——排序一次遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-operations-to-make-array-values-equal-to-k/ 给你一个整数数组 nums 和一个整数 k 。 如果一个数组中所有 严格…...

紫光展锐5G SoC T8300:影像升级,「定格」美好世界

影像能力已成为当今衡量智能手机性能的重要标尺之一。随着消费者对手机摄影需求日益提升&#xff0c;手机厂商纷纷在影像硬件和算法上展开激烈竞争&#xff0c;力求为用户带来更加出色的拍摄体验。 紫光展锐专为全球主流用户打造的畅享影音和游戏体验的5G SoC——T8300&#x…...

java基础 关键字static

static static使用简介static结合类的生命周期1.加载2.链接(1) 验证&#xff08;Verification&#xff09;(2) 准备&#xff08;Preparation&#xff09;(3) 解析&#xff08;Resolution&#xff09; 3. 初始化4.使用5.卸载总结 staic作用总结静态变量静态代码块静态方法静态内…...

大数据学习(105)-大数据组件分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

Spark运行

一文读懂Spark&#xff1a;从核心概念到实战编程 在大数据处理领域&#xff0c;Spark凭借其高效的计算能力和灵活的架构脱颖而出。今天&#xff0c;就来和大家深入聊聊Spark&#xff0c;帮助初学者快速入门。Spark采用经典的master - slave结构。Driver如同master&#xff0c;…...

在macOS的docker中如何安装及运行ROS2

1、macOS环境及版本 2、docker for macos版本 3、拉取ROS2镜像 docker pull ros:iron 4、查看容器 docker images 5、启动 ROS2 容器 docker run -it --rm ros:iron -it &#xff1a;以交互模式运行容器。 --rm &#xff1a;退出时自动删除容器&#xff08;测试时推荐&am…...

FFmpeg安装和使用

1. 安装与环境配置 Windows # 方法1&#xff1a;官网下载预编译二进制包 https://ffmpeg.org/download.html#build-windows 解压后添加bin目录到系统PATH# 方法2&#xff1a;通过Chocolatey安装 choco install ffmpegmacOS # 使用Homebrew安装 brew install ffmpegLinux # …...

基于多模态大模型的ATM全周期诊疗技术方案

基于多模态大模型的ATM全周期诊疗技术方案 1. 数据预处理模块 算法1:多模态数据融合伪代码 def multimodal_fusion(data_dict):# 输入:包含MRI、EEG、实验室指标的字典# 输出:对齐后的张量序列# 模态对齐aligned_data = temporal_alignment(data_dict,sampling_rate...

写时复制Copy-on-Write(COW)

简单理解写时复制 读的时候&#xff0c;直接访问原对象。 写的时候&#xff0c;对复制原对象&#xff0c;对副本进行写操作&#xff0c;最后将副本替换原对象。 写时复制多用于读多写少的场景&#xff0c;因为写操作是用悲观锁进行的&#xff0c;如果写的场景多&#xff0c;…...

S7-1200 PLC热电偶和热电阻模拟量模块

热电偶和热电阻模拟量模块 S7-1200 PLC有专用用于对温度进行采集的热电偶模块SM1231 TC和SM 1231RTD。热电偶模块有4AI和8AI两种&#xff0c;下面以SM1231 TC 4AI为例看一下接线图。 该模块一共有4个通道&#xff0c;每个通道有两个接线端子&#xff0c;比如0&#xff0c;0-。…...

ffmpeg函数简介(封装格式相关)

文章目录 &#x1f31f; 前置说明&#xff1a;FFmpeg 中 AVFormatContext 是什么&#xff1f;&#x1f9e9; 1. avformat_alloc_context功能&#xff1a;场景&#xff1a; &#x1f9e9; 2. avformat_open_input功能&#xff1a;说明&#xff1a;返回值&#xff1a; &#x1f9…...

操作数组的工具类

Arrays 它里面的每一个方法基本上都是static静态修饰的&#xff0c;如果想要调用里面的方法&#xff0c;不需要创建对象&#xff0c;直接用类名.就可以了 操作数组的工具类 方法&#xff1a; public static String toString&#xff08;数组&#xff09; 把数组拼接成…...

小刚说C语言刷题——第19讲 循环之continue和break

在循环中&#xff0c;当我们得到想要的答案时&#xff0c;这时我们可能要提前结束循环&#xff0c;这个时候我们就会用到break。而我们有时需要结束某一次循环时&#xff0c;我们可以用continue。 1.break语句 (1)在循环中想要提前终止循环&#xff0c;要用break。 (2)语法格…...

FairMOT复现过程中cython_bbox库问题

cython_bbox库就该这么安装_cython-bbox库就应该-CSDN博客...

记录学习的第二十四天

还是每日一题。 题解很巧&#xff0c;我根本想不到。 class Solution { public: int minOperations(vector<int>& nums, int k) { int count; int mnnums[0]; //接下来查找nums数组中最小值 for(int i1;i<nums.size();i) { if(nums[i]<mn) { mnnums[i]; } } …...

Kubernetes 入门篇之网络插件 calico 部署与安装

在运行kubeadm init 和 join 命令部署好master和node节点后&#xff0c;kubectl get nodes 看到节点都是NotReady状态&#xff0c;这是因为没有安装CNI网络插件。 kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Not…...

HTTP 压力测试工具autocannon(AI)

简介 autocannon 是一款基于 Node.js 的高性能 HTTP 压力测试工具&#xff0c;适用于评估 Web 服务的并发处理能力和性能瓶颈。 一、工具特点 高性能‌&#xff1a;利用 Node.js 异步非阻塞机制模拟高并发请求‌。‌实时监控‌&#xff1a;测试过程中动态展示请求统计和性能…...

【面试】封装、继承、多态的具象示例 模板编程的理解与应用场景 链表适用的场景

文章目录 C面试&#xff1a;封装、继承、多态的具象示例1. 封装 (Encapsulation)2. 继承 (Inheritance)3. 多态 (Polymorphism)综合示例&#xff1a;封装、继承、多态 C模板编程的理解与应用场景我对模板编程的理解C中最常用的模板编程场景1. STL (标准模板库)2. 通用容器实现3…...

机器学习02——概要

一、简介 机器学习是一门在没有明确编程的情况下让计算机学习的科学。 监督学习是有目标的&#xff0c;输入数据对应明确的输出&#xff1b;无监督学习则是“探索”型的&#xff0c;模型的目标是从数据中发现潜在的模式或结构&#xff0c;而不需要预先知道标签。 二、机器学…...

常用的网络安全靶场、工具箱

转载&#xff1a;https://blog.csdn.net/zjzqxzhj/article/details/137945444 打CTF很好玩。可以试一下 1.CTF在线工具 1、CTF在线工具箱&#xff1a;http://ctf.ssleye.com/ 包含CTF比赛中常用的编码、加解密、算法。 2、CTF加解密工具箱&#xff1a;http://www.atoolbox.…...

excel中的VBA指令示例(一)

示例注释&#xff1a; Sub 宏1() sub是宏开头&#xff0c;宏1是宏的名称&#xff0c;自定义&#xff0c;在按钮中可指定用某个宏 后面是注释 Sheets("装配材料").Select ‘选择表 装配材料 Ce…...

神经网络 | 基于脉冲耦合神经网络PCNN图像特征提取与匹配(附matlab代码)

内容未发表论文基于脉冲耦合神经网络(PCNN)的图像特征提取与匹配研究 摘要 本文提出一种基于脉冲耦合神经网络(Pulse-Coupled Neural Network, PCNN)的图像特征提取与匹配方法。通过模拟生物视觉皮层神经元的脉冲同步发放特性,PCNN能够有效捕捉图像纹理与边缘特征。实验表…...

Linux 内核中的 TCP 早期多路分解机制解析

一、引言 在现代高性能网络环境中,Linux 内核需要快速处理大量的 TCP 数据包,同时保持低延迟和高吞吐量。为了实现这一目标,Linux 内核引入了 早期多路分解(Early Demultiplexing) 机制。这种机制允许内核在数据包进入传输层之前,快速找到对应的套接字(socket)并关联数…...

Yalmip工具箱(3)——错误类型

在yalmip中&#xff0c;不可避免地我们会遇到求解出问题的情况&#xff0c;理解和处理错误信息是至关重要的环节。在这里我们查看yalmip的所有错误类型&#xff08;详细见 yalmiperror.m 函数&#xff09; 函数概述 yalmiperror函数的主要作用是根据YALMIP产生的错误代码&…...

【KWDB 创作者计划】_KWDB:开源引领数据库创新变革

在数字化浪潮汹涌澎湃的当下&#xff0c;数据已然成为驱动各行各业发展的核心要素。数据库作为数据管理的关键工具&#xff0c;其性能、功能以及开放性&#xff0c;对企业和社会的数字化进程起着举足轻重的作用。KWDB&#xff0c;作为数据库领域的一颗璀璨新星&#xff0c;正以…...

HarmonyOS学习 实验八:显式动画与属性动画的实现

鸿蒙系统动画开发实战&#xff1a;显式动画与属性动画的探索 引言 在鸿蒙系统的开发过程中&#xff0c;动画效果是提升用户体验的重要一环。通过巧妙运用动画&#xff0c;可以使应用界面更加生动、交互更加流畅。鸿蒙系统提供了丰富的动画开发能力&#xff0c;其中显式动画和…...

高校智慧能源系统解决方案:推动绿色校园建设的智能化实践

高校智慧能源系统解决方案&#xff1a;推动绿色校园建设的智能化实践 一、建设背景&#xff1a;政策驱动与绿色发展需求 为响应国家“碳达峰、碳中和”战略目标&#xff0c;教育部印发《绿色低碳发展国民教育体系建设实施方案》&#xff0c;明确提出需完善校园能源管理体系&a…...

win日志

以第一个为例子 打开后&#xff0c;右上角&#xff08;将所有事件另存为xx)然后一般写今天的日期&#xff0c;进行备份 然后选择下语言即可 日志备份时间的选择&#xff08;根据实际情况选择日志时间&#xff09; 点击右侧事件属性&#xff0c;然后xml视图即可 常见的安全事件…...

嵌入式开发之51单片机入门(一)与LED灯的故事

得而不惜就该死。 --小泽 继续傻冒开始&#xff0c;这次的傻冒之旅是关于嵌入式的51单片机开发&#xff0c;这个系列只讲程序开发逻辑&#xff0c;如需初始环境安装配置&#xff0c;建议移步B站江协科技大佬&#xff0c;本系列也是对大佬所讲内容的复刻&#xff0c;同时添加一…...

TCP 与 UDP

TCP 与 UDP 的区别&#xff08;重要&#xff09; 是否面向连接&#xff1a;UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务&#xff0c;在传送数据之前必须先建立连接&#xff0c;数据传送结束后要释放连接。是否是可靠传输&#xff1a;远地主机在收到 UDP 报…...

Linux:进程地址空间

在讲述本篇文章之前&#xff0c;我们先来看一段代码。 从上图输出可以看到&#xff0c;我们的子进程继承了父进程的全局变量val&#xff0c;当子进程中的val产生了修改时&#xff0c;父进程的val值并没有变化&#xff0c;但父子进程在打印val的地址时&#xff0c;会发现val的地…...

【Linux】Linux 操作系统 - 03 ,初步指令结尾 + shell 理解

文章目录 前言一、打包和压缩二、有关体系结构 (考)面试题 三、重要的热键四、shell 命令及运行原理初步理解五、本节命令总结总结 前言 本篇文章 , 笔者记录的笔记内容包含 : 基础指令 、重要热键 、shell 初步理解 、权限用户的部分问题 。 内容皆是重要知识点 , 需要认真理…...

华为数通不同级别的认证路径和要求是什么?

一、认证路径 HCIA&#xff1a;无需前置认证&#xff0c;通过一门考试&#xff08;代码H12-811&#xff09;即可拿证。 HCIP&#xff1a;建议先通过HCIA-Datacom&#xff0c;再选择子方向&#xff08;如高级路由、安全&#xff09;。 HCIE&#xff1a;最好有hcia/hcip的基础…...

电子电气架构 --- 新能源汽车电子电气系统功能需求

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

《从单体到分布式:一个订单系统的架构升级》

1. 问题爆发&#xff1a;单体架构的极限​​ 原来的订单系统长这样&#xff1a; ​​技术栈​​&#xff1a;SpringBoot MyBatis MySQL&#xff08;主从&#xff09;​​部署​​&#xff1a;单机跑所有模块&#xff08;订单、支付、库存&#xff09;​​痛点​​&#xff…...

琴键上的强化学习:让机器人在真实世界里弹钢琴!

在科技飞速发展的今天&#xff0c;机器人的能力边界不断拓展。想象一下&#xff0c;机器人坐在钢琴前&#xff0c;行云流水地弹奏出美妙乐章&#xff0c;这不再是科幻电影里的场景。近日&#xff0c;科研人员在机器人弹钢琴领域取得了突破性进展&#xff0c;让我们一同走进这个…...

【Unity网络编程知识】C#的 Http相关类学习

1、搭建HTTP服务器 使用别人做好的HTTP服务器软件&#xff0c;一般作为资源服务器时使用该方式&#xff08;学习阶段建议使用&#xff09;自己编写HTTP服务器应用程序&#xff0c;一般作为Web服务器或者短连接游戏服务器时使用该方式&#xff08;工作后由后端程序员来做&#…...

【算法学习】链表篇:链表的常用技巧和操作总结

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在各种数据结构中&#xff0c;链表是最常用的几个之一&#xff0c;熟练使用链表和链表相关的算法&#xff0c;可以让我们在处理很多问题上都更加…...

【前端笔记】CSS预处理语言 LESS

官网&#xff1a; Less 快速入门 | Less.js 中文文档 - Less 中文网 LESS很多地方可以比CSS简写很多 安装 npm install -g less 核心优势&#xff1a;变量、嵌套、混合、运算功能让CSS更容易维护&#xff0c;比原生CSS更加简洁高效 1. 变量&#xff08;Variables&#xff09…...

Oracle 查看后台正在执行的 SQL 语句

在 Oracle 数据库中&#xff0c;要查看后台正在执行的 SQL 语句&#xff0c;可以通过查询动态性能视图&#xff08;Dynamic Performance Views&#xff09;或使用监控工具来实现。 1. 查询动态性能视图 (1) 查看当前活跃会话及其执行的 SQL 使用 v$session 和 v$sql 视图关联…...

强化学习原理二 BasicConcepts

状态&#xff0c;State 状态空间&#xff0c;State Space 行动&#xff0c;Action状态转换&#xff0c;state transition策略&#xff0c;Policy 用数组或者矩阵表示这样一个策略 奖励&#xff0c;Reward 不确定的话&#xff0c;表格就不适用了。这个时候就要用数学来表示&…...

【机密计算顶会解读】13:CAGE:通过 GPU 扩展补充 Arm CCA

导读&#xff1a;本文介绍GAGE&#xff0c;利用Arm CCA中的现有硬件安全特性来确保敏感数据的安全性&#xff0c;支持GPU加速的机密计算&#xff0c;在实际平台上的平均性能开销仅为 2.45%&#xff0c;在保持高性能的同时&#xff0c;提供了良好的数据安全保护&#xff0c;且其…...

Android 使用kill -9(SIGKILL信号)强制终止Native进程时,是否会生成tombstone文件

在Android系统中&#xff0c;​使用kill -9&#xff08;SIGKILL信号&#xff09;强制终止Native进程时&#xff0c;不会生成tombstone文件。以下是具体原因和背景分析&#xff1a; 1. ​SIGKILL信号的特性 ​SIGKILL&#xff08;信号9&#xff09;​ 是Linux系统中最高优先级…...

WPS JS宏编程教程(从基础到进阶)-- 第六部分:JS集合与映射在 WPS 的应用

目录 第6章 JS集合与映射在 WPS 的应用6-1 集合的创建(实例:唯一值提取)示例代码详细解析Excel 环境模拟说明6-2 集合的不重复特性应用(案例:提取唯一值记录)示例代码详细解析案例说明6-3 集合成员添加与删除示例代码代码解析直观示意(Excel 模拟表格)6-4 集合成员添加…...

1.VTK 使用CMakeLists

文章目录 1.创建目录2.配置VTK编译环境3.创建main.cpp4.CMake编译 1.创建目录 选择一个空文件夹创建CMakeLists.txt 文件&#xff0c;注意CMakeLists不要写错 2.配置VTK编译环境 cmake_minimum_required(VERSION 3.5) # 最低要求 CMake 3.5&#xff0c;避免兼容性问题 proje…...

PDFtk

如果下载的pdf文件有秘钥的话&#xff0c;使用下面linux命令去掉秘钥&#xff1a; pdftk 纳税记录.pdf input_pw 261021 output 纳税记录_output.pdf将多个单页pdf合并为一个pdf的linux命令: pdftk 自然人电子税务局1.pdf 自然人电子税务局2.pdf 自然人电子税务局3.pdf 自然人…...