设计模式之原型模式笔记

设计模式之原型模式笔记

  • 说明
  • Prototype(原型)
  • 目录
  • UML原型模式示例类图
    • RealizeType类(浅克隆)
    • 测试类
  • 原型模式案例
    • 奖状类
    • 测试类
  • 扩展(深克隆)
    • 学生类
    • 奖状类
    • 测试类

说明

记录下学习设计模式-原型模式的写法。

Prototype(原型)

意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
结构:
在这里插入图片描述

其中:

  • Prototype声明一个复制自身的接口。
  • ConcretePrototype实现一个复制自身的操作。
  • Client让一个原型复制自身从而创建一个新的对象。

适用性:

  • 当一个系统应该独立于它的产品创建、构成和表示时。
  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
  • 为了避免创建一个与产品类层次平行的工厂类层次时。
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

目录

在这里插入图片描述

UML原型模式示例类图

在这里插入图片描述

以该UML类图实现原型模式示例。

RealizeType类(浅克隆)

浅克隆:创建一个新对象,新对象的属性和原来完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
Java中的Object类提供了clone()方法来实现浅克隆。

package com.example.deesign_patterns.prototype.demo;

public class RealizeType implements Cloneable{

    //idea快捷键生成构造方法:alt+Ins键
    public RealizeType() {
        System.out.println("具体原型对象创建完成!");
    }

    @Override
    protected RealizeType clone() throws CloneNotSupportedException {
        System.out.println("具体原型复制成功!");
        return (RealizeType) super.clone();
    }
}

测试类

package com.example.deesign_patterns.prototype.demo;

public class Client {

    public static void main(String[] args) throws CloneNotSupportedException {
        //创建一个原型类对象
        RealizeType realizeType=new RealizeType();
        //调用RealizeType类中的clone方法进行对象的克隆
        RealizeType clone=realizeType.clone();
        System.out.println("原型对象和克隆出来的是否是同一个对象?"+(realizeType==clone));//结果为false,说明不是同一个对象
    }
}

在这里插入图片描述

原型模式案例

类图如下:
在这里插入图片描述

奖状类

package com.example.deesign_patterns.prototype.demo2;

//奖状类
public class Citation implements Cloneable{

    //三好学生上的姓名
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void show(){
        System.out.println(name+"同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!");
    }

    @Override
    protected Citation clone() throws CloneNotSupportedException {
        return (Citation) super.clone();
    }
}


测试类

package com.example.deesign_patterns.prototype.demo2;

//测试类
public class CitationTest {

    public static void main(String[] args) throws CloneNotSupportedException {
        //1.创建原型对象
        Citation citation=new Citation();
        //2.克隆奖状对象
        Citation citation1=citation.clone();
        citation.setName("张三");
        citation1.setName("李四");
        //3.调用show方法
        citation.show();
        citation1.show();
    }
}

在这里插入图片描述

扩展(深克隆)

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

学生类

package com.example.deesign_patterns.prototype.demo3;

import java.io.Serializable;

//学生类必须实现Serializable,不然会抛NotSerializableException异常
public class Student implements Serializable {

    //学生的姓名
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}


奖状类

package com.example.deesign_patterns.prototype.demo3;

import java.io.Serializable;

//奖状类必须实现Serializable,不然会抛NotSerializableException异常
public class Citation implements Cloneable, Serializable {

    //学生类
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public void show(){
        System.out.println(student.getName()+"同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!");
    }

    @Override
    protected Citation clone() throws CloneNotSupportedException {
        return (Citation) super.clone();
    }
}

测试类

使用浅克隆结果如下:

package com.example.deesign_patterns.prototype.demo3;

//测试类
public class CitationTest {

    public static void main(String[] args) throws Exception {
        //1.创建原型对象
        Citation citation=new Citation();
        //创建张三学生对象
        Student student=new Student();
        student.setName("张三");
        citation.setStudent(student);

        //2.克隆奖状对象
        Citation citation1=citation.clone();
        citation1.getStudent().setName("李四");
        3.调用show方法
        citation.show();
        citation1.show();
    }
}

在这里插入图片描述
使用深克隆结果如下:

package com.example.deesign_patterns.prototype.demo3;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

//测试类
public class CitationTest {

    public static void main(String[] args) throws Exception {
        //1.创建原型对象
        Citation citation=new Citation();
        //创建张三学生对象
        Student student=new Student();
        student.setName("张三");
        citation.setStudent(student);
		
		//使用对象流进行深克隆
        //创建对象输出流对象(文件目录随便写,如果没有会自动生成这个文件)
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/a.txt"));
        //写对象
        oos.writeObject(citation);
        //释放资源
        oos.close();

        //创建对象输入流对象
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/a.txt"));
        //读取对象
        Citation citation1= (Citation) ois.readObject();
        //释放资源
        ois.close();

        //2.获取学生对象
        citation1.getStudent().setName("李四");
        //3.调用show方法
        citation.show();
        citation1.show();
    }
}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/31318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何监测和优化阿里云服务器的性能?有哪些性能分析工具和指标?

如何监测和优化阿里云服务器的性能?有哪些性能分析工具和指标?   阿里云服务器性能监测与优化是云计算服务中一个非常重要的环节。为了确保服务器稳定、高效地运行,我们需要对其性能进行监测,并在监测的基础上进行优化。本文将为…

突破 Python 爬虫的瓶颈:WebKit 在线模拟技术与环境搭建

部分数据来源:ChatGPT 引言 在使用 Python 进行爬虫开发的时候,很多情况下我们需要利用一些浏览器内核来模拟浏览器行为。而目前最为常用的两种浏览器内核是基于 WebKit 和基于 Chromium 的内核。那么在 Windows 10 操作系统中,我们可以使用 Anaconda 作为 Python 的发行版…

CSS3-定位

网页常见布局方式 1 标准流 1 块级元素独占一行 → 垂直布局 2 行内元素/行内块元素一行显示多个 → 水平布局 2 浮动 可以让原本垂直布局的 块级元素变成水平布局 3 定位 1 可以让元素自由的摆放在网…

使用SOCKET搭建linux和window实现实时摄像头传输(linux传输win端使用C++mfc显示)--Win端开发

1.使用MFC搭建框架 配置: Window10VS2013opencv249 如果VS和opencv配置不一样,让版本对应 Opencv与VS版本 1.1 MFC项目搭建 通过这些步骤就创建了一个MFC基础项目。 1.2项目属性配置 本项目因为要使用opencv,所以就要配置以下opencv的环境 首先在opencv官网下载…

(十一)CSharp-LINQ(1)

一、LINQ 数据库可以通过 SQL 进行访问,但在程序中,数据要被保存在差异很大的类对象或结构中。由于没有通用的查询语言来从数据结构中获取数据。所以可以使用 LINQ 可以很轻松地查询对象集合。 LINQ 高级特性: LINQ 代表语言集成查询。LIN…

王道计算机网络学习笔记(1)——计算机网络基本知识

前言 文章中的内容来自B站王道考研计算机网络课程,想要完整学习的可以到B站官方看完整版。 一:计算机网络基本知识 1.1.1:认识计算机网络 计算机网络的功能 网络把许多计算机连接在一起,而互联网则将许多网络连接在一起&#x…

vue3+ts+vite+electron打包exe

文章目录 一. 前言二. 准备写好的vue项目打包2.1 修改ts打包代码检测.这个比较烦人. 在package.json中 2.2 配置打包参数2.3 打包vue 三. 打包exe3.1 拉取electron官方demo3.2 下载打包插件3.3 在electron-quick-start项目中找到入口文件 main.js ,修改打包的文件路…

【大数据hive】hive 拉链表设计与实现

目录 一、前言 二、拉链表业务背景 2.1 数据同步引发的问题 2.1.1 解决方案1 2.1.2 解决方案2 2.1.3 解决方案3 三、拉链表设计与原理 3.1 功能与应用场景 3.2 实现步骤 3.2.1 Step1 3.2.2 Step2 3.2.3 Step3 3.3 操作演示 3.3.1 创建一张表并加载数据 3.3.2 模…

segment anything环境配置与使用测试

硬件:RTX3070 i9-11900H 内存16G 目录 一、环境配置 二、使用测试--predictor_example.ipynb 1.jupyter notebook准备操作 2.Object masks from prompts with SAM与Environment Set-up 3.Set-up 4.Example image 5.Selecting objects with SAM 6.Specifyin…

在openSUSE-Leap-15.5-DVD-x86_64的gnome下使用远程桌面tigervnc

在openSUSE-Leap-15.5-DVD-x86_64的gnome下使用远程桌面tigervnc 在openSUSE-Leap-15.5-DVD-x86_64的tigervnc-1.12.0软件设计有变动了,变为一开机就启动远程桌面服务,没有vncserver取而代之是Xvnc,也在自己之前写的一篇博文的基础上作了修改…

开源大型语言模型(llm)总结

大型语言模型(LLM)是人工智能领域中的一个重要研究方向,在ChatGPT之后,它经历了快速的发展。这些发展主要涉及以下几个方面: 模型规模的增长:LLM的规模越来越大,参数数量显著增加。这种扩展使得…

Elasticsearch:DSL Query

Query DSL的分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有的数据,一般测试用,例如:match_all,但有分页限制,一次20…

i5 3470+XSB75M-PK+HD 7750安装黑苹果macOS Big Sur 11.7.7

我本次使用的是 HD 7750 进行安装黑苹果(闲鱼80元买的),这款显卡直接就是免驱,最高可以安装的版本是 macOS Monterey ,但是建议安装至 macOS Big Sur 以获得较好的体验。 EFI(OC引导) EFI.zip …

【网络2】MII MDIO

文章目录 1.MII:ISO网络模型中物理层(phy)和数据链路层(mac)属于硬件,其余都属于软件kernel2.MDC/MDIO:不仅管phy,只要支持mdio协议都可以管2.1 3.RGMII时序调整:下面波形…

2023-06-19 Untiy进阶 C#知识补充2——C#版本与Unity的关系

文章目录 一、Unity 与 C# 版本二、Unity 的 .Net API 兼容级别 一、Unity 与 C# 版本 Unity 版本C# 版本Unity 2021.2C# 9Unity 2020.3C# 8Unity 2019.4C# 7.3Unity 2017C# 6Unity 5.5C# 4 ​ 更多信息可以在 Unity 官网说明查看:Unity - Manual: C# compiler (u…

EMC学习笔记(七)阻抗控制(一)

阻抗控制(一) 1.特征阻抗的物理意义1.1 输入阻抗1.2 特征阻抗1.3 偶模阻抗、奇模阻抗、差分阻抗 2.生产工艺对阻抗控制的影响 1.特征阻抗的物理意义 1.1 输入阻抗 在集总电路中,输入阻抗是经常使用的一个术语 ,它的物理意义是: …

在 Debian 12 上安装 KubeSphere 实战入门

老 Z,运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 知识点 定级:入门级KubeKey 安装部署 KubeSphere 和 KubernetesDebian 操…

arm64架构的linux中断分析(一)

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 2.5 硬件中断号和软件中断号 1. 中断的概念和作用 当计算机的CPU需要在执行任务的同时响应外部事件时,中断是一种重要的…

6月份读书学习好文记录

看看CHATGPT在最近几个月的发展趋势 https://blog.csdn.net/csdnnews/article/details/130878125?spm1000.2115.3001.5927 这是属于 AI 开发者的好时代,有什么理由不多去做一些尝试呢。 北大教授陈钟谈 AI 未来:逼近 AGI、融进元宇宙,开源…

kafka消息队列的初步探索

消息队列的作用就是提高运行速度,防止线程堵塞。 kafka的作用 异步 通过在消息队列发送消息的方式,将对应的业务作为监听者,此时我们只需要考虑发送消息的时间即可,大大提高了运行的速度。 解耦 如果使用原来的直接调用对应业务的…
最新文章