小谈设计模式(10)—原型模式

news2024/11/28 19:32:59

小谈设计模式(10)—原型模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 原型模式
    • 角色分类
      • 抽象原型(Prototype)
      • 具体原型(Concrete Prototype)
      • 客户端(Client)
      • 原型管理器(Prototype Manager)
    • 核心思想
    • Java代码实现
      • 代码分析
    • 优缺点分析
      • 优点
        • 简化对象的创建
        • 隐藏对象的创建细节
        • 支持动态添加和修改对象的属性
        • 提供了一种可替代的对象创建方式
      • 缺点
        • 克隆方法的实现可能较为复杂
        • 克隆对象与原型对象的关系可能较为复杂
        • 克隆对象的创建方式受限

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

原型模式

这是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过实例化类来创建。它通过克隆现有对象的属性和方法来创建新对象,从而避免了创建对象时的重复工作。

在这里插入图片描述

角色分类

抽象原型(Prototype)

定义了克隆方法的接口,通常是一个接口或抽象类。该接口中声明了一个克隆方法,用于复制原型对象。

具体原型(Concrete Prototype)

实现了抽象原型接口,提供了克隆方法的具体实现。具体原型对象通过克隆方法创建新的对象,同时复制原型对象的属性和方法。

客户端(Client)

通过调用克隆方法来创建新的对象。客户端可以通过克隆方法复制原型对象,然后根据需要修改克隆对象的属性。

原型管理器(Prototype Manager)

用于管理原型对象的创建和克隆过程。原型管理器可以维护一个原型对象的注册表,客户端通过原型管理器获取原型对象的克隆。

核心思想

原型对象的克隆方法,通过克隆方法可以复制原型对象的属性和方法,从而创建新的对象。客户端可以根据需要通过克隆方法创建新的对象,并可以自由地修改克隆对象的属性。原型模式可以有效地提高对象的创建效率,并使对象的创建过程更加灵活和可扩展。
在这里插入图片描述

Java代码实现

// 原型接口
interface Prototype {
    Prototype clone();
}

// 具体原型类
class ConcretePrototype implements Prototype {
    private String name;

    public ConcretePrototype(String name) {
        this.name = name;
    }

    public Prototype clone() {
        return new ConcretePrototype(this.name);
    }

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

    public String getName() {
        return this.name;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建原型对象
        Prototype prototype = new ConcretePrototype("原型对象");

        // 克隆原型对象
        Prototype clone = prototype.clone();

        // 修改克隆对象的属性
        ((ConcretePrototype) clone).setName("克隆对象");

        // 输出原型对象和克隆对象的属性
        System.out.println("原型对象的属性:" + prototype.getName());
        System.out.println("克隆对象的属性:" + ((ConcretePrototype) clone).getName());
    }
}

代码分析

在上面的示例中,我们定义了一个原型接口 Prototype,其中包含一个 clone 方法用于克隆原型对象。然后,我们创建了一个具体原型类 ConcretePrototype,实现了 Prototype 接口,并在 clone 方法中返回一个新的克隆对象。

在客户端代码中,我们创建了一个原型对象 prototype,然后使用 clone 方法克隆了一个新的对象 clone。接下来,我们修改了克隆对象的属性,并输出了原型对象和克隆对象的属性。
在这里插入图片描述

优缺点分析

优点

简化对象的创建

原型模式通过克隆原型对象来创建新的对象,避免了重复创建对象的过程,提高了对象的创建效率。

隐藏对象的创建细节

客户端通过克隆方法获取新的对象,无需关心对象的创建细节,使得对象的创建过程对客户端透明。

支持动态添加和修改对象的属性

克隆对象可以独立于原型对象进行修改,不会影响到原型对象,使得对象的创建更加灵活和可扩展。

提供了一种可替代的对象创建方式

原型模式可以作为一种可替代的对象创建方式,特别适用于创建复杂对象或需要大量初始化的对象。

缺点

克隆方法的实现可能较为复杂

如果对象的属性较为复杂或存在循环引用等问题,实现克隆方法可能较为复杂。

克隆对象与原型对象的关系可能较为复杂

克隆对象与原型对象之间可能存在一定的关联关系,需要在克隆方法中进行处理,增加了代码的复杂性。

克隆对象的创建方式受限

克隆对象的创建方式受限于原型对象的结构,需要保证原型对象实现了克隆方法,且克隆方法能够正确地复制对象的属性。
在这里插入图片描述

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

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

相关文章

《C++ Primer》第4章 表达式(二)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 4.6 成员访问运算符(P133) 点运算符和箭头运算符都可用于访问成员,ptr->mem 等价于 (*ptr).mem 。箭头作用于指针类型对象,结果为左值;点运算符…

【Mysql】 blob 转text

有个数据表字段存储的字段类型是blob,想查看字段内容。 blob是二进制的无法直接查看怎么办? 写sql,blob 转text SELECT CONVERT(content USING utf8) FROM article_content ; 我想把原来content字段完全转成text 新建 text 类型字段conten…

uniapp 在uni.scss 根据@mixin定义方法 、通过@include全局使用

在官方文档中提及到uni.scss中变量的使用,而我想定义方法,这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道,在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…

三、浏览器缓存动如何使用(Expires、 cache-control、Etag、last-modified)----哪些文件需要强缓存,哪些文件需要协商缓存

参考链接1:彻底弄懂强缓存与协商缓存 参考链接2:浏览器缓存 参考链接3:扼杀 304,Cache-Control: immutable 如何搭建 express,或者node服务 ### 如何搭建 express,npm install express --save### expre…

[C++基础]-多态

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…

智能AI系统源码ChatGPT系统源码+详细搭建部署教程+AI绘画系统+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…

NFT Insider#110:The Sandbox与TB Media Global合作,YGG Web3游戏峰会阵容揭晓

引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#xff0…

双字单字拆分/合并操作(博途SCL源代码)

博途PLC的位、字节拆分和合并操作还可以参考下面的文章链接: 博途PLC 位/字/字节 Bit/ Word/Byte拆分与合并_博途的bit-CSDN博客有时候我们需要将分散分布的开关量信号组合为一个整体比如一个字节再完成发送,或者一些报警联锁控制,组合为一个字方便触摸屏报警记录等,下面我…

day11_oop_面向对象基础

零、今日内容 一、作业 二、面向对象 一、作业 题目26 设计方法,在一个数组中,返回所有的 指定数据的下标 例如, 这个数组[1,2,8,4,5,7,8,7,8,9],找到其中元素8的下标[2,6,8]public static void main(String[] args) {int[] arr {1,2,8,4,5,7,8,7,8,9};int[] ind…

云计算安全的新挑战:零信任架构的应用

文章目录 云计算的安全挑战什么是零信任架构?零信任架构的应用1. 多因素身份验证(MFA)2. 访问控制和策略3. 安全信息和事件管理(SIEM)4. 安全的应用程序开发 零信任架构的未来 🎉欢迎来到云计算技术应用专栏…

vue-3

一、文章内容概括 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 二、Vue生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好&#xff09…

二叉搜索树的初步认识

二叉搜索树与常见的查找算法有什么区别? 首先,如果有同学不知道有哪些查找算法可以查看:常见查找算法_加瓦不加班的博客-CSDN博客 如果还有一些不了解的,请查看加瓦不加班_数据结构,链表,递归-CSDN博客 接下来,我们来…

玄子Share- IDEA 2023 SpringBoot 热部署

玄子Share- IDEA 2023 SpringBoot 热部署 修改 IDEA 部署设置 IDEA 勾选如下选项 新建 SpringBoot 项目 项目构建慢的将 Spring Initializr 服务器 URL 改为阿里云:https://start.aliyun.com/ 在这里直接勾选Spring Boot Devtools插件即可 测试 切出 IDEA 项目文…

「专题速递」AR协作、智能NPC、数字人的应用与未来

元宇宙是一个融合了虚拟现实、增强现实、人工智能和云计算等技术的综合概念。它旨在创造一个高度沉浸式的虚拟环境,允许用户在其中交互、创造和共享内容。在元宇宙中,人们可以建立虚拟身份、参与虚拟社交,并享受无限的虚拟体验。 作为互联网大…

2023年H1汽车社媒营销趋势报告

2023上半年车市“内卷”,汽车营销玩法越来越多样,品牌的矩阵式营销也成为头部车企重点营销战略。 据乘联会预测,2023下半年车市将受到二季度价格战的透支,需要一定修复期。在整体形势较不利的情况下,车企如何破局实现销…

通过IP地址如何计算相关地址

以IP地址为1921681005 子网掩码是2552552550为例。算出网络地址、广播地址、地址范围、主机数。 分步骤计算 1) 将IP地址和子网掩码换算为二进制,子网掩码连续全1的是网络地址,后面的是主机地址。 虚线前为网络地址,虚线后为主机…

基于Java的个性化旅游攻略系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

yolov7的bug,无法指定显卡(程序默认0号卡)

**问题:**命令行参数指定的是4号卡,但实际却总是在0号卡建立进程 真抽象啊,这一步,模型被送到0号卡,但实际上,送到了4号卡(进程是在4号卡上建立的) 解决办法: 在train.py…

【LeetCode热题100】--230.二叉搜索树中第K小的元素

230.二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 二叉搜索树的中序遍历是有序的,所有先得到其有序序列,然后在取…

端口没有占用,Springboot却提示端口占用了

1.问题描述 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 19004 was already in use.Action:Identify and stop the process thats listening on port 19004 or configure this applica…