设计模式之原型模式笔记

news2024/11/29 14:52:09

设计模式之原型模式笔记

  • 说明
  • 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.coloradmin.cn/o/663907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring之IOC容器从入门都手写源码

文章目录 一、IOC容器1、控制反转(ioc)2、依赖注入3、IoC容器在Spring的实现 二、基于XML管理Bean1、获取bean方式一、根据id获取方式二、根据类型获取方式三、根据id和类型获取bean 2、依赖注入之setter注入3、依赖注入之构造器注入4、特殊值处理5、为对…

基于llama模型进行增量预训练

目录 1、llama模型转换(pytorch格式转换为HuggingFace格式) 1.1、拉取Chinese-LLaMA-Alpaca项目 1.2、准备文件夹 1.3、下载llama官方原始模型 1.4、移动文件到指定位置 1.5、执行转换脚本 2、合并模型 2.1、下载Chinese-LLaMA-Plus-7B模型 2.2、下载chinese_alpaca_p…

【Leetcode60天带刷】day16二叉树—— 104.二叉树的最大深度 , 111.二叉树的最小深度,222.完全二叉树的节点个数

题目: 104. 二叉树的最大深度 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ …

数字电路基础---寄存器

目录 数字电路基础---寄存器 1、寄存器简介 1.1、寄存器是如何工作的 2、实验任务 3、程序设计 3.1、模块设计 3.2、绘制波形图 4、编写代码 5、仿真验证 5.1、编写 TB 文件 5.2、仿真验证 6、总结 7、拓展训练 数字电路基础---寄存器 寄存器是构成时序逻辑最重要…

理解安卓的视图体系结构

原文链接 理解安卓的视图体系结构 当我们想要写一个页面的时候,通过一个Activity,然后调用其setContentView方法,把一个布局文件当作一个参数传递过去,然后一个页面就好了,但是除此之外,我们还需要与一些组…

【MySql】MySql索引的作用索引的理解

【MySql】MySql索引的作用&&索引的理解 文章目录 索引的作用认识磁盘MySql 与磁盘交互基本单位Page共识索引的理解主键有序问题理解单个Page理解多个Page页目录单页情况多页情况 索引的作用 索引是与效率挂钩的,所以没有索引,可能会存在问题 索…

从0到1搭建属于自己的Gitlab CI/CD平台

文章目录 持续集成(CI)持续交付(CD)Gitlab CI/CD功能和架构本地搭建GitLab CI/CD平台 MCNU云原生,文章首发地,欢迎微信搜索关注,更多干货,第一时间掌握! CI和CD是软件开发中常用的缩写,分别代表持续集成&am…

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令

更新日期:2023年6月19日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 指令系统1.使用指令系统2.自定义指令1.新建类 MyInstruction2.标记 CustomInstruction 特性3.编写指令的逻辑4.执行自定义指令5.自定义指令的参数6.结尾 …

C进阶 - 数组和指针

Declare an array manually VS malloc or calloc an array 用英文是因为有些东西得用他们的语言才能表达不失真 栈和堆 In C, a heap is a region of memory that is dynamically allocated during runtime. It is used to store variables and data structures that have a …

学习HCIP的day.14

目录 STP生成树协议 生成树协议 一、802.1D 1、根网桥 2、根端口 3、指定端口 4、非指定端口 5、接口状态 802.1D的收敛时间 802.1D算法的缺点 以上cost值的解释 二、PVST 三、PVST 四、快速生成树 五、MSTP/MST/802.1S STP生成树协议 网络三层架构…

南京企业所得税高怎么办?

南京企业所得税高怎么办? 《税筹顾问》专注于园区招商,您的贴身节税小能手,合理合规节税! 众所周知,企业所得税是按利润来计算的,按照不同的利润阶梯计算适用的税率也会有所不同,那么当企业利润…

launch文件的编写及ROS配置文件的详细介绍

launch文件的编写及ROS配置文件的详细介绍 1 launch文件介绍及简单应用1.1 launch文件介绍1.2 launch文件简单应用 2 package.xml文件介绍及配置3 CMakeLists.txt文件介绍及配置 1 launch文件介绍及简单应用 1.1 launch文件介绍 根据ROS的架构和通信机制来看,ROS的…

讯飞星火大模型详细内测体验:它能否应对这些挑战?

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简要介绍二、分类问题测试0️⃣自我介绍1️⃣语言理解2️⃣知识问答3️⃣逻辑推…

Vue中如何进行文件转换与格式转换

Vue中如何进行文件转换与格式转换 在Web应用程序中,经常需要进行文件转换和格式转换。例如,将PDF文件转换为图像文件、将音频文件转换为不同的格式或将视频文件转换为不同的分辨率和编解码格式。Vue作为一种流行的前端框架,提供了许多实用工…

网络管理与维护(二)网络用户设置管理

网络用户设置管理 2.1 用户帐户安全管理 用户账户的分类 管理员帐户。拥有管理本台计算机的所有权限和权利。系统内置的Administrator用户帐户 和Administrators组帐户的成员就属于管理员帐户 标准帐户。通常分配给最终用户使用,适用于日常工作,对操作…

GeoServer中地图可视化提升利器之SLD知识简介

目录 前言 一、SLD简介 1、介绍 2、SLD的版本 3、SLD的Schema说明 二、SLD中相关知识解析 1、Scheme简要说明 2、一个SLD实例 总结 前言 在互联网上有很多精美的地图,在地图从shp或者gdb等矢量文件,经过设计人员的加工,配色&#xff0…

【论文阅读】Graph-less Collaborative Filtering

【论文阅读】Graph-less Collaborative Filtering 文章目录 【论文阅读】Graph-less Collaborative Filtering1. 来源2. 介绍3. 模型解读3.1 协同过滤3.2 模型3.2.1 对比知识精馏 3.2.2 自适应对比正则化3.2.3 SimRec的参数学习 4. 实验5. 总结 1. 来源 2023WWW CCFA原文地址co…

【Linux】linux | 服务响应慢、问题排查 | 带宽问题导致 | 网速

一、说明 1、项目使用云服务器,服务器配置:5M带宽、4核、32G,1T,CentOS7 2、CPU、内存、磁盘IO都没有达到瓶颈,猜测是带宽问题 3、应用比较多,应用中间件,十几个差不多 4、同时在线人数30 5、已…

“暗网议会”如今已成为现实

图片来源:Marcin Balcerzak 最近,“暗网议会”已经成为了网络犯罪分子试图证明自己影响力的最新流行语,安全内部人士对这个词也很感兴趣。 上周五,臭名昭著的亲俄黑客组织Killnet在其电报威胁帖子中使用了这个词语。随后,twitte…

d2l_第五章学习_Multilayer Perceptrons多层感知机

x.1 Hidden Layers 线性模型的基本假设是单调,即任何特征的增大都会导致模型的输出增大(权重正时,负值时亦)。但是现实中很多的关系并不仅仅是简单的线性关系,这个时候就需要引入非线性关系,而非线性关系由…