原型模式的学习与使用

news2024/12/28 5:52:49

1、原型模式的学习

  当我们需要创建一个对象,并且该对象的创建过程比较复杂或者耗时时,可以使用原型模式。原型模式通过复制现有对象的属性来创建新的对象,而不是从头开始创建。
  在原型模式中,我们定义一个原型接口或抽象类,该接口或抽象类定义了克隆方法。具体的原型类实现克隆方法,并根据自身的属性创建新的对象。
  通过使用原型模式,我们可以避免重复创建对象的开销,提高创建对象的效率。它还使得对象的创建更加灵活,因为我们可以根据需要克隆现有对象,而无需依赖于具体的类和构造函数。
  以下是原型模式的一些关键要点:

  • 原型接口或抽象类:定义克隆方法,用于创建新对象的副本。
  • 具体的原型类:实现原型接口或抽象类,并根据自身的属性进行克隆。
  • 客户端:使用原型对象创建新的对象,而无需关心具体的实现细节。
    在这里插入图片描述

2、原型模式的使用

  假设你正在开发一个游戏,其中有一种怪物叫做"巨型哥布林"。每个巨型哥布林都有自己的属性(如血量、攻击力等)和外观(如模型、颜色等)。你需要设计一个原型模式来创建巨型哥布林对象,并能够快速复制多个相同属性的怪物。
具体的原型类

@Data
public class BigGoblin implements Cloneable {

    protected Integer blood;

    protected Integer offensive;

    protected String model;

    protected String colour;

    public BigGoblin(Integer blood, Integer offensive, String model, String colour) {
        this.blood = blood;
        this.offensive = offensive;
        this.model = model;
        this.colour = colour;
    }

    @Override
    protected BigGoblin clone() {
        try {
            return (BigGoblin) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }

}

客户端

public class protoTypeClient {

    public static void main(String[] args) {
        BigGoblin goblin = new BigGoblin(100, 50, "丑陋", "green");
        BigGoblin bigGoblin = goblin.clone();
        bigGoblin.setColour("yellow");
        System.out.println(JSON.toJSONString(goblin));
        System.out.println(JSON.toJSONString(bigGoblin));
    }
}
{"blood":100,"colour":"green","model":"丑陋","offensive":50}
{"blood":100,"colour":"yellow","model":"丑陋","offensive":50}

3、总结

原型模式的优点包括:

  • 减少对象的创建成本,避免了重复的初始化操作。
  • 可以更灵活地创建对象,通过克隆现有对象来创建新对象,而无需依赖具体的类和构造函数。
  • 提高了性能,特别是在创建对象成本较高的情况下。
    需要注意以下几点:
  • 克隆方法需要注意深拷贝(深拷贝需要在clone方法中新创建对象)和浅拷贝的问题,确保克隆对象的属性不会相互影响。
  • 原型模式适用于对象的创建过程相对复杂、耗时的情况下,如果对象的创建过程比较简单,直接使用new关键字创建即可。

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

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

相关文章

CMU 15-445 -- Buffer Pool - 03

CMU 15-445 -- Buffer Pool - 03 引言Buffer PoolsBuffer Pool ManagerLock 和 Latch 的区别PAGE TABLE 和 PAGE DIRECTORYMultiple Buffer PoolsPrefetchingScan SharingBuffer Pool BypassOS Page Cache Buffer Replacement PoliciesLRUClockLRU 与 Clock 的问题LRU-KLocaliz…

如何优雅的将 Docker 镜像从 1.43G 瘦身到 22.4MB

Docker 镜像的大小对于系统的 CI/CD 等都有影响,尤其是云部署场景。我们在生产实践中都会做瘦身的操作,尽最大的可能使用 Size 小的镜像完成功能。下文是一个简单的 ReactJS 程序上线的瘦身体验,希望可以帮助大家找到镜像瘦身的方向和灵感。 …

Helm之深入浅出Kubernetes包管理工具使用

Chart 使用 作者:行癫(盗版必究) 一:Chart 模板使用 1.创建chart ​ templates目录包括了模板文件;当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates目录中;然后收集模板的结果并发送给Kubernetes ​ values.yaml 文件也导入到了模板;这个文件包含了c…

北京大学2016计算机学科夏令营上机考试

目录 A:分段函数【水题】 B:单词翻转【暴力不水】 C:反反复复【字符串】 D:文件结构“图”【图】 E:Exchange Rates【这不是我能做的】 F:Dungeon Master【没看懂题目什么意思】 G:重建二叉树【树】 A:分段函数【水题】 #include<iostream> using namespace std;…

如何自学入门网络安全/黑客?【建议收藏】

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

零基础学会Python编程——不同的运算:算术、关系与逻辑(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 学习目标 一. 运算 1.算术运算 2.加法运算 3.减法运算 4.乘法运算 5.除法…

Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解

文章目录 0. 前言1. 基本原理1.1 基于频道(Channel)的发布/订阅1.2 基于模式(Pattern)的发布/订阅 2. Redis 发布订阅实际应用2.1 Redis Sentinel2.1 SpringBoot Redis发布/订阅 3. Redis从入门到精通系列文章 0. 前言 发布订阅模式&#xff08;Publish-Subscribe Pattern&…

小而强大:通过容器化应用实现前端微服务

微服务架构是一种软件架构模式&#xff0c;用于构建复杂应用程序。它将一个大型的单体应用程序拆分为一组更小、更独立的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;并通过轻量级的通信机制进行交互。每个服务都专注于解决特定的业务功能或服务&#xff0c;并且…

Distractor-aware Siamese Networks for Visual Object Tracking(DaSiamRPN)

Distractor-aware Siamese Networks for Visual Object Tracking&#xff08;DaSiamRPN&#xff0c;ECCV2018&#xff09; 该论文针对以下三个问题&#xff0c;分别进行了改进&#xff1a; 常见的Siam类跟踪方法只能区分目标和无语义信息的背景&#xff08;即简单背景&#x…

MacBook(M1)上安装Ubuntu虚拟机

Mac&#xff08;M1&#xff09;上安装Ubuntu虚拟机 0.下载资料汇总 VMware Fusionhttps://www.vmware.com/products/fusion/fusion-evaluation.htmlubuntu-desktop-arm64.isohttps://cdimage.ubuntu.com/jammy/daily-live/current/ 1.安装VMware Mac版本的VMware叫 VMware …

SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks&#xff08;CVPR2019&#xff09; 为什么2018年提出的SiamRPN网络还在用老式的AlexNet作为Siamese Network的特征提取网络呢&#xff1f;其实SiamRPN也尝试过用ResNet替代AlexNet&#xff0c;但发现效…

gitlab使用教程

一&#xff1a;账号管理 1、管理员添加 gitlab的用户分为管理员用户和普通用户&#xff0c;在界面上管理员会多了如下图所示的管理员区域&#xff0c;管理员拥有用户管理的功能&#xff0c;普通用户没有此功能。 通过管理员区域的用户-添加用户&#xff0c;根据提示填写必要…

JVM02-JVM即时编译器JIT

1-类编译加载执行过程 先了解下Java从编译到运行的整个过程 类编译&#xff1a;在编写好代码之后&#xff0c;我们需要将 .java文件编译成 .class文件&#xff0c;才能在虚拟机上正常运行代码。文件的编译通常是由JDK中自带的Javac工具完成&#xff0c;一个简单的 .java文件&a…

使用Flutter开发俄罗斯方块小游戏

一、本篇文章主要是来讲解下俄罗斯方块游戏的开发思路&#xff08;当然可能不是最好的思路&#xff09;&#xff0c;博客文章顶部有代码&#xff08;仅供参考&#xff09; 二、效果图 视频效果图地址 三、UI页面思路拆解 游戏的主界面两部分组成&#xff0c;上面为15*10的格…

Proxyman 替换js

在真机排查问题时&#xff0c;js不能格式化&#xff0c;导致没法看问题出在那一行&#xff0c;此时可以用这个方法替换js。 方法&#xff1a; 安装proxyman后&#xff0c;以iOS设备为例&#xff0c;菜单-证书-在iOS上安装证书 电脑、真机连接同一个网络&#xff0c;配置代理&…

SparkCore

Spark是一种快速、通用、可扩展的大数据分析引擎 Spark的特点 Speed&#xff1a;快速高效 性能比Hadoop MapReduce快100倍。即便是不将数据cache到内存中&#xff0c;其速度也是MapReduce10 倍以上。 Ease of Use&#xff1a;简洁易用 Spark支持 Java、Scala、Python和R等…

ctfshow—红包4

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 from secrets import randbelow from nationalsecret import p, r, k, flagg 2 y pow(g, k, p)def gogogo():print("Another chance:")t int(input(t ))c randbelow(p)print("Here is my…

关于anaconda的python虚拟环境

1.查看anaconda的虚拟环境 在cmd中输入 conda env list //查看conda中的虚拟环境和 activate 环境名称 //激活环境 pip list //查看该环境的包 python // 可以查看该环境python的版本 deactivate //退出环境2.使用anaconda创建新的…

Java Web HTMLCSS(2)23.6.30

2&#xff0c;CSS 2.1 概述 CSS 是一门语言&#xff0c;用于控制网页表现。我们之前介绍过W3C标准。W3C标准规定了网页是由以下组成&#xff1a; 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript CSS也有一个专业的名字&#xff1a;Cascading Style Sh…