二十三种设计模式之原型模式

一.什么是原型模式

‌原型模式是一种创建型对象设计模式,它通过复制一个已经创建的实例(即原型对象)来创建一个和原型对象相同的新对象。‌ 这种模式在面向对象软件设计中非常有用,因为它允许通过复制现有对象来快速生成多个相似的对象,而无需重新初始化每个对象。原型模式的工作原理是将一个原型对象传给需要创建新对象的类,该类通过请求原型对象的拷贝来实现创建过程。

二.原型模式的类图

三.cloneable接口

对于深拷贝和浅拷贝不是很理解的,可以参考下面的文章

参考博文:cloneable详细说明

cloneable接口存在于java.lang包中

官方手册解释

总之,cloneable是浅拷贝,在对引用类型进行拷贝时,对于引用类型成员变量来说,原型和复制品的地址都是同一个,这样就会造成要改全部改的情况。这时候就要重新开辟空间,实现深拷贝。

四.实例

创建一个输出框样式,使得打印的样式不同。有两种样式一种是下划线,另一种是四边都有框。其中,cloneable接口的实现是关键。product类实现了cloneable接口,underlinpen和MessageBox继承了product类,这样就可以调用clone方法复制开辟的对象空间,而不需要重新分配。

Manager.java

package framework;
import java.util.*;
public class Manager {
private HashMap showcase=new HashMap();
public void register(String name,product pro) {showcase.put(name, pro);
}
public product create(String pro) {product p=(product)showcase.get(pro);return p.createClone();
}
}

product.java

package framework;public interface product extends Cloneable{
public abstract void use(String s);
public abstract product createClone();
}

MessageBox.java

package style;
import framework.*;
public class MessageBox implements product{
private char decochar;
public MessageBox(char decochar) {this.decochar=decochar;
}
public void use(String s) {int length=s.getBytes().length;for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");System.out.println(decochar+" "+s+" "+decochar);for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");
}
@Override
public product createClone() {// TODO Auto-generated method stubproduct p=null;try {p=(product)clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return p;
}
}

underlinepen.java

package style;
import framework.*;
public class underlinepen implements product{
private char ulchar;
public underlinepen(char ulchar) {this.ulchar=ulchar;
}
public void use(String s) {int length=s.getBytes().length;System.out.println("'\'"+s+"\"");for(int i=0;i<length+4;i++) {System.out.print(ulchar);}System.out.println("");
}
@Override
public product createClone() {// TODO Auto-generated method stubproduct p=null;try {p=(product)clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return p;
}
}

输出结果:

五.为什么要使用原型模式?

原型模式的适用情况:

1.对象种类繁多,无法将它们整合到一个类中。

2.难以根据类生成实例时

3.想解耦框架,生成实例时

原型模式是一种创建型对象设计模式,它允许通过复制已有对象来创建新对象,而不需要使用显式的构造函数调用来创建。这种模式特别适用于对象创建成本较高或耗时较长的场景,通过复制一个现有对象的属性和方法来创建新对象,从而避免了昂贵的创建过程。

六.习题

习题6-1

我的答案:

将product改为c抽象类实现cloneable接口,将createClone方法写入product内。MessageBox和UnderlinePan继承product类。

product.java

package framework;public abstract class product implements  Cloneable{
public abstract void use(String s);
public product createClone() {product p=null;try {p=(product)clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return p;
}
}

MessageBox.java

package style;
import framework.*;
public class MessageBox extends product{
private char decochar;
public MessageBox(char decochar) {this.decochar=decochar;
}
public void use(String s) {int length=s.getBytes().length;for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");System.out.println(decochar+" "+s+" "+decochar);for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");
}}

underlinePan.java

package style;
import framework.*;
public class underlinepen extends product{
private char ulchar;
public underlinepen(char ulchar) {this.ulchar=ulchar;
}
public void use(String s) {int length=s.getBytes().length;System.out.println("'\'"+s+"\"");for(int i=0;i<length+4;i++) {System.out.print(ulchar);}System.out.println("");
}
}

参考答案:

习题6-2答案

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

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

相关文章

新160个crackme - 057-bbbs-crackme04

运行分析 因软件版本老旧&#xff0c;需使用windows XP虚拟机运行有个SystemID&#xff0c;值为12345678需破解User ID和Password PE分析 yC壳&#xff0c;32位 OD手动脱壳 使用windows XP虚拟机&#xff0c;将程序拖入OD按一下F8&#xff0c;ESP变红&#xff0c;根据ESP定律设…

子比主题美化 - 可移动悬浮窗 弹窗功能代码教程

移动页面演示效果 这个功能完全适配子比主题使用&#xff0c;代码开源&#xff0c;可以做其它功能弹窗或者菜单栏等等&#xff0c;后期有时间在做成桌面页面也可以鼠标移动&#xff0c;点击参考&#xff1a;移动悬浮窗详细代码教程

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后&#xff0c;在系统启动时&#xff0c;会自动启动MySQL服务&#xff0c;无需手动启动。 也可以手动的通过指令启动停止&#xff0c;以管理员身份运行cmd&#xff0c;进入命令行执行如下指令&#xff1a; 1 、 net start mysql80…

SpringBoot父子工程搭建

SpringBoot父子工程搭建 1、父工程 1.1、创建父工程 1.2、移除无用文件 1.3、修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

秋韵虫趣.

文章目录 虫鸣概览虫坛文化蟀种纷呈中华蟋蟀宁阳蟋蟀刻点铁蟋长颚斗蟋 油葫芦棺头蟋中华灶蟋小素蟋树皮蟋蟀 花生大蟋斑腿针蟋其他鸣虫树蟋&#xff0c;又名竹蛉、邯郸梨片蟋&#xff0c;又名金钟、天蛉、绿蛣蛉、银琵琶凯纳奥蟋&#xff0c;又名石蛉&#xff0c;鳞蟋黄蛉蟋&am…

NarratoAI利用AI大模型,一键解说并剪辑视频

测试视频: 字幕/配乐后期添加的,视频由NarratoAI自动生成的 雪迷宫-NarratoAI利用AI大模型剪辑解说视频测试 WIN整合包 下载链接&#xff1a;https://pan.quark.cn/s/8f54ef99e3fb 使用前先更新&#xff0c;运行update.bat Gemini API Key 访问 https://aistudio.google.c…

quartz 搭配SQL Server时出现deadlock的解决方案

背景&#xff1a; 最近在折腾换OA系统&#xff0c;遇到了一个很诡异的事情。在测试阶段&#xff0c;OA系统经常莫名地宕机&#xff0c;停止响应。查下来&#xff0c;发现是数据库出现大量死锁&#xff0c;耗尽了连接池。出现问题的语句是一样的&#xff0c;问题锁定在QRTZ_TRI…

C++ 面试必备知识大全:从基础到高级特性全面解析

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; C 面试中常见的问题涵盖了语言基础、面向对象编程、内存管理、STL&#xff08;标准模板库&#xff09;、并发编程、设计模式等。以下是一些常见的 C 面试问题及其详细答案总结&#xff1…

第311题| 超好用!二重积分求旋转体体积公式|武忠祥老师每日一题

第一步&#xff1a; &#xff08;1&#xff09;找渐近线&#xff0c;先看水平渐近线&#xff0c;看x趋于无穷时&#xff0c;y有没有趋于一个有限的值。 , 得出水平渐近线y1。因为左右两边都是水平渐近线&#xff0c;所以没有斜渐近线。 第二步&#xff1a; 画出图像&#…

e选择排序---复杂度O(X^2)

排序原理: 1.每一次遍历的过程中&#xff0c;都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个素引处的值&#xff0c;则假定其他某个索引出的值为最小值&#xff0c;最后可以找到最小值所在的索引 2.交换第一个索引处和最小值所…

LocalMamba: Visual State Space Model with Windowed Selective Scan 论文总结

题目&#xff1a;LocalMamba: Visual State Space Model&#xff08;视觉状态空间模型&#xff09; with Windowed Selective Scan&#xff08;窗口化的选择扫描&#xff09; 论文&#xff1a;[2403.09338] LocalMamba: Visual State Space Model with Windowed Selective Scan…

STM32F407单片机开发入门(二)STM32F407VET6单片机详解

文章目录 一.概要二.单片机型号命名规则三.STM32F407系统架构四.STM32F40VET6单片机启动流程五.STM32F40VET6单片机主要外设资源六.开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.STM32F407单片机内部框图3.STM32F407单片机管脚图4.STM32F407单片机每个管脚功能5.单…

艾里斑(Airy Disk)与瑞利判据(Rayleigh criterion)

艾里斑的定义与形成 艾里斑&#xff08;Airy Disk&#xff09;&#xff0c;又称艾里图样&#xff08;Airy Pattern&#xff09;&#xff0c;是光通过圆形孔径发生衍射时&#xff0c;在焦点处形成的光斑。这一现象由英国数学家和天文学家George Biddell Airy在19世纪首次详细描…

Linux服务器中在指定python环境中新建notebook

在指定环境下建立新的IPython内核pip install ipykernel生成ipykernel的配置文件&#xff1a;python -m ipykernel install --user --name netCLR 其中--user是指在用户级别生成&#xff0c;如果没有--user就会在系统中安装&#xff0c;如果不是管理员的话就会没有权限生成&…

Acrobat XI 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

MySQL练手题--公司和部门平均工资比较(困难)

一、准备工作 Create table If Not Exists Salary (id int, employee_id int, amount int, pay_date date); Create table If Not Exists Employee (employee_id int, department_id int); Truncate table Salary; insert into Salary (id, employee_id, amount, pay_date) va…

FreeRTOS—任务通知

一&#xff0c;概念介绍 队列、信号量、事件组等IPC技术都需要创建一个中间对象进程之间通过这些中间对象进行通讯或同步。创建对象就需要分配内存&#xff0c;占用一定内存。 二&#xff0c;任务通知的特点&#xff1a; 一个任务或ISR向另外一个指定的任务发送通知&#xff0c…

『功能项目』切换职业技能面板【49】

我们打开上一篇48切换职业面板的项目&#xff0c; 本章要做的事情是制作第二职业法师技能面板、第三职业面板并且完成切换 双击打开Canvas进入预制体空间 复制三个技能栏面板 重命名 设置第一技能栏 设置第二职业技能栏 设置第三职业技能栏 修改脚本&#xff1a;ChangeProfess…

Java设计模式—面向对象设计原则(五) ----->迪米特法则(DP) (完整详解,附有代码+案例)

文章目录 3.5 迪米特法则(DP)3.5.1 概述3.5.2 案例 3.5 迪米特法则(DP) 迪米特法则&#xff1a;Demeter Principle&#xff0c;简称DP 3.5.1 概述 只和你的直接朋友交谈&#xff0c;不跟“陌生人”说话&#xff08;Talk only to your immediate friends and not to stranger…

华为CNA VRM搭建(使用vmware worfstartion搭建)

创建虚拟机&#xff1a; 自定义→高级 选择硬件兼容性&#xff1a;默认安装版本&#xff0c;如果未来想要将此虚拟机安装到其他电脑&#xff0c;其他电脑版本过低&#xff0c;此时可以向下兼容&#xff0c;这里我们默认版本 稍后安装操作系统&#xff1a; CNA采用Euler OS系统…