Prototype 原型

news2024/11/23 16:58:54

意图

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

结构

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

适用性

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

代码示例

// 产品接口
interface Product {
    Product clone();
}

// 具体产品A
class ProductA implements Product {
    private String name;
    private int age;

    public ProductA(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public Product clone() {
        return new ProductA(name, age);
    }

    // ... 其他方法
}

// 具体产品B
class ProductB implements Product {
    private String color;
    private double weight;

    public ProductB(String color, double weight) {
        this.color = color;
        this.weight = weight;
    }

    @Override
    public Product clone() {
        return new ProductB(color, weight);
    }

    // ... 其他方法
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建原型对象
        ProductA productA = new ProductA("ProductA", 10);
        ProductB productB = new ProductB("Red", 1.5);

        // 克隆原型对象
        ProductA clonedProductA = productA.clone();
        ProductB clonedProductB = productB.clone();

        // 修改克隆对象
        clonedProductA.setName("ClonedProductA");
        clonedProductB.setColor("Blue");

        // 输出结果
        System.out.println(productA); // 输出: ProductA{name='ProductA', age=10}
        System.out.println(clonedProductA); // 输出: ProductA{name='ClonedProductA', age=10}
        System.out.println(productB); // 输出: ProductB{color='Red', weight=1.5}
        System.out.println(clonedProductB); // 输出: ProductB{color='Blue', weight=1.5}
    }
}

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

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

相关文章

HashMap的常见问题

Entry中的hash属性为什么不直接使用key的hashCode()返回值呢? 不管是JDK1.7还是JDK1.8中,都不是直接用key的hashCode值直接与table.length-1计算求下标的,而是先对key的hashCode值进行了一个运算,JDK1.7和JDK1.8关于hash()的实现…

如何卸载干净 IDEA(图文讲解)

更新时间 2022-12-20 11:一则或许对你有用的小广告 星球 内第一个项目:全栈前后端分离博客项目,演示地址:Weblog 前后端分离博客, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot Mybatis Plus Vue 3.x Vit…

lanqiao.602 迷宫

题目&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; char mp[31][51]; //稍微开大一点 char k[4]{D,L,R,U}; //按字典序记录路径 int dirx[]{1,0,0,-1},d…

给picgo上传的图片加个水印

之前给大家介绍了picgo和免费的图床神器。我们本可以开开心心的进行markdown写作了。 但是总是会有那么一些爬虫网站过来爬你的文章&#xff0c;还把你的文章标明是他们的原著。咋办呢&#xff1f;这里有一个好的办法就是把markdown中上传的图片加上自己的水印不就行了。 说干…

【复现】CVE-2024-29269 某国外路由器RCE漏洞_72

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 在 Telesquare TLR-2005Ksh 1.0.0 和 1.1.4 中发现的一个问题允许攻击者通过 Cmd 参数运行任意系统命令。 二 .漏洞影响 通过提交…

C语言---顺序表(二)

文章目录 前言1.准备工作2.代码的实现2.1.顺序表的创建、销毁和打印2.2.顺序表的扩容、头插\删、尾插\删2.2.1.扩容2.2.2.尾插2.2.3.头插2.2.3.尾删2.2.4.头删 2.3.指定位置之前插入/删除数据/查找数据2.3.1.指定位置之前插入数据2.3.2.指定位置之前删除数据2.3.3.查找特定数据…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

Linux-select剖析

一、select函数 select函数是IO多路复用的函数&#xff0c;它主要的功能是用来等文件描述符中的事件是否就绪&#xff0c;select可以使我们在同时等待多个文件缓冲区 &#xff0c;减少IO等待的时间&#xff0c;能够提高进程的IO效率。 select()函数允许程序监视多个文件描述符…

旋转编码器原理(超简单)

波形图 A相和B相的状态变化与旋转方向有关。当顺时针旋转时&#xff0c;A相引脚会先变化&#xff0c;然后是B相引脚。而逆时针旋转时&#xff0c;B相引脚会先变化&#xff0c;然后是A相引脚 这是两个引脚的实际波形采样&#xff0c;越密集的旋转的越快 可以发现特点&#xff0…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支&#xff0c;各个分支相互独立&#xff0c;互不干扰 分支的相关命令&#xff0c;具体如下&#xff1a; git branch 查看分支 git branch [name] 创建分支&#x…

面试题:重写equals(),为什么还要重写hashcode()

认识equals(): Object类中的equals; public boolean equals(Object obj) {return (this obj);}当我们没有重写equals&#xff08;&#xff09;&#xff0c;我们是调用父类object中的方法&#xff0c;比较的是对象的内存地址 重写equals后&#xff0c; public class Student…

蓝桥杯嵌入式(G431)备赛笔记——DMA+UART

目录 CubeMX配置&#xff1a; 代码配置: DMA通道接收&#xff1a; DMA通道发送&#xff1a; 注意&#xff1a; 主函数中记得开启串口接收回调函数&#xff1a; 加了DMA的UART接收通道和一般的区别&#xff1a; 加了DMA的UART发送和一般的区别&#xff1a; CubeMX配置&…

Day23_学点儿Java_多态复习

1 做错的选择题 Java中的多态性是通过以下哪个机制实现的&#xff1f;&#xff08;&#xff09; A. 方法重载 B. 方法覆盖 C. 抽象类 D. 接口2 多态复习 2.1 学点儿Java_Day7_继承、重载、重写、多态、抽象类 2.2 面向对象四大基本特征 封装、抽象、继承、多态 封装 面向…

【翻译】再见, Clean Code!

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

CTF-SHOW SSRF

web351 存在一个flag.php页面&#xff0c;访问会返回不是本地用户的消息&#xff0c;那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议&#xff0c;之后判断我们传入的url中是否含有localhost和127.0.0&#xff0c;如果没有则…

JAVA集合ArrayList

目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove&#xff08;element&#xff09;用法 remove&#xff08;index&#xff09;用法 get(index)用法 set(index,element) 练习 test1 定义一个集合&#xff0c;添加字符串&#xff0c;并进行遍历&…

【JavaWeb】Day42.MySQL概述——多表查询

介绍 多表查询&#xff1a;查询时从多张表中获取所需数据 单表查询的SQL语句&#xff1a;select 字段列表 from 表名; 如果要执行多表查询&#xff0c;只需要使用逗号分隔多张表即可&#xff0c;如&#xff1a; select 字段列表 from 表1, 表2; 例如&#xff1a;查询…

解决mac本git安装后找不到命令的问题

不熟悉mac配置&#xff0c;折腾了半天&#xff0c;记录一下。 1.问题描述2.解决方法 1.问题描述 从https://sourceforge.net/projects/git-osx-installer/files/下载的git安装包&#xff1a; 安装时提示&#xff1a; 这里的解决办法是按住control键再打开文件安装。 安装完…

数据分析案例(一):地区收入的PCA主成分分析

练习1 地区收入的PCA主成分分析 0.变量说明 1.导包操作 核心思路&#xff1a;导入基础数据操作库包&#xff0c;PCA、k-means 库包&#xff0c;数据可视化库包 import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing i…