设计模式(四) | 简历复印与原型模型不得不说的一些事

2024-03-16 04:48

本文主要是介绍设计模式(四) | 简历复印与原型模型不得不说的一些事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原型模型

  • 原型模式其实就是从一个对象基础上再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

  • 原型模型可以大大提高效率。一般在初始化的信息不发生变化的情况下,克隆是最好的办法,即隐藏了创建对象的细节,又对性能有大大的提升。

  • 看代码就知道怎么回事了。以书写简历为例:


  1. public class Resume implements Cloneable{

  2.    String name;

  3.    String sex;

  4.    String age;

  5.    String timearea;

  6.    String company;

  7.    public Resume(String name) {

  8.        super();

  9.        this.name = name;

  10.    }

  11.    public Resume() {

  12.        super();

  13.    }

  14.    //设置个人信息

  15.    public void setPersonInfo(String sex,String age){

  16.        this.sex = sex;

  17.        this.age = age;

  18.    }

  19.    //设置个人信息

  20.    public void setWorkExperience(String timearea,String company){

  21.        this.timearea = timearea;

  22.        this.company = company;

  23.    }

  24.    @Override

  25.    public String toString() {

  26.        return  name + "  " + sex + "  " + age + "\n工作经历:" + timearea + "   "

  27.                + company;

  28.    }

  29.    public Object Clone() throws Exception{

  30.        return this.clone();

  31.    }

  32. }

  33. public class Test {

  34.    public static void main(String[] args) throws Exception {

  35.        Resume a = new Resume("大鸟");

  36.        a.setPersonInfo("男", "20岁");

  37.        a.setWorkExperience("2013-2017", "东北林业大学");

  38.        Resume b = (Resume)a.Clone();

  39.        b.setWorkExperience("2017-2022", "哈尔滨工业大学");

  40.        Resume c = (Resume)a.Clone();

  41.        c.setWorkExperience("2022-2030", "google");

  42.        System.out.println(a);

  43.        System.out.println(b);

  44.        System.out.println(c);

  45.    }

  46. }


输出结果:

 


  1. 大鸟    20

  2. 工作经历:2013-2017   东北林业大学

  3. 大鸟    20

  4. 工作经历:2017-2020   哈尔滨工业大学

  5. 大鸟    20

  6. 工作经历:2020-2022   google


注:上述代码是原型模型的浅复制,只能复制值类型的数据,对于引用类型的对象不能复制。



如果将工作经历也单独做一个类,然后在resume类中应用工作经历,就会输出3条一模一样的结果。



浅复制被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都任指向原来的对象。

将工作经历也单独做一个类的代码:

 


  1. public class WorkExperience {

  2.    String timearea;

  3.    String company;

  4.    public String getTimearea() {

  5.        return timearea;

  6.    }

  7.    public void setTimearea(String timearea) {

  8.        this.timearea = timearea;

  9.    }

  10.    public String getCompany() {

  11.        return company;

  12.    }

  13.    public void setCompany(String company) {

  14.        this.company = company;

  15.    }

  16.    @Override

  17.    public String toString() {

  18.        return "\n工作经历" + timearea + "  " + company;

  19.    }

  20. }

  21. public class Resume implements Cloneable{

  22.    String name;

  23.    String sex;

  24.    String age;

  25.    WorkExperience work;

  26.    public Resume(String name) {

  27.        super();

  28.        this.name = name;

  29.        work = new WorkExperience();

  30.    }

  31.    public Resume() {

  32.        super();

  33.    }

  34.    //设置个人信息

  35.    public void setPersonInfo(String sex,String age){

  36.        this.sex = sex;

  37.        this.age = age;

  38.    }

  39.    public void setWorkExperience(String timearea,String company){

  40.        work.timearea  = timearea;

  41.        work.company = company;

  42.    }

  43.    @Override

  44.    public String toString() {

  45.        return name + "  " + sex + "  " + age + work ;

  46.    }

  47.    public Object Clone() throws Exception{

  48.        return this.clone();

  49.    }

  50. }


输出结果

 


  1. 大鸟    20

  2. 工作经历:2020-2022   google

  3. 大鸟    20

  4. 工作经历:2020-2022   google

  5. 大鸟    20

  6. 工作经历:2020-2022   google


深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。



二层深复制的代码:

 


  1. public class WorkExperience implements Cloneable{

  2.    String timearea;

  3.    String company;

  4.    public String getTimearea() {

  5.        return timearea;

  6.    }

  7.    public void setTimearea(String timearea) {

  8.        this.timearea = timearea;

  9.    }

  10.    public String getCompany() {

  11.        return company;

  12.    }

  13.    public void setCompany(String company) {

  14.        this.company = company;

  15.    }

  16.    @Override

  17.    public String toString() {

  18.        return "\n工作经历" + timearea + "  " + company;

  19.    }

  20.    public Object Clone() throws Exception{

  21.        return this.clone();

  22.    }

  23. }

  24. public class Resume implements Cloneable{

  25.    String name;

  26.    String sex;

  27.    String age;

  28.    WorkExperience work;

  29.    public Resume(String name) {

  30.        super();

  31.        this.name = name;

  32.        work = new WorkExperience();

  33.    }

  34.    public Resume() {

  35.        super();

  36.    }

  37.    private Resume(WorkExperience work) throws Exception {

  38.        super();

  39.        this.work = (WorkExperience)work.Clone();

  40.    }

  41.    //设置个人信息

  42.    public void setPersonInfo(String sex,String age){

  43.        this.sex = sex;

  44.        this.age = age;

  45.    }

  46.    public void setWorkExperience(String timearea,String company){

  47.        work.timearea  = timearea;

  48.        work.company = company;

  49.    }

  50.    @Override

  51.    public String toString() {

  52.        return name + "  " + sex + "  " + age + work ;

  53.    }

  54.    public Object Clone() throws Exception{

  55.        Resume obj = new Resume(this.work);

  56.        obj.name = this.name;

  57.        obj.age = this.age;

  58.        obj.sex = this.sex;

  59.        return obj;

  60.    }

  61. }


输出结果:

 


  1.    大鸟    29

  2.    工作经历2013-2017  东北林业大学

  3.    大鸟    29

  4.    工作经历2017-2022  哈尔滨工业大学

  5.    大鸟    29

  6.    工作经历2020-2030  google


代码改动的地方:

  • 让WorkExperience类也实现了Cloneable的接口,并增加了clone()方法。

  • 在resume类中新增了一个私有的构造方法。

  • 修改了resume的clone()的方法。


往期回顾

设计模式(一) | 啥是工厂模式和策略模式?

设计模式(二) | 装饰模式---穿什么有这么重要?

设计模式(三) | 为别人做嫁衣---代理模式

0?wx_fmt=png

这篇关于设计模式(四) | 简历复印与原型模型不得不说的一些事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814334

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus