设计模式概述之原型模式(六)

news/2024/12/5 6:56:13/

常说的设计模式是23种设计模式,分为3大类:

  • 创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型
  • 结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合
  • 行为型模式11种:模板方法、解释器、策略、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者。

上次咱们说了“建造者模式”。今天来说“原型模式”。

“原型模式”是指已有一个类(原型类),将此类赋予可clone(克隆)的功能方法。

“class Anything”是将要克隆的一个类,必须实现Cloneable接口以支持clone功能,还要实现Serializable接口以支持序列化功能。(至于什么是序列化请参考IO技能中的“序列化与反序列化”的知识点取查阅。)

“class AnyOne”此类是“class Anything”的一个属性,也就是它的组成部分。

“class Anything”重写了clone方法,在实例化对象后,调用clone方法,方法返回结果是克隆后的对象将与原型对象不是同一对象。但是,它的组成部分“class AnyOne”的对象仍然和原型对象中的属性是同一对象,所以这样重写的clone方法叫“浅克隆”,仅仅是调用了父类的clone方法。

 

如果想要把“class Anything”实例化的对象及内部组成部分“class AnyOne”的对象完全克隆,就要用深克隆的方式解决。

 

“深克隆”指的是,将类中所有涉及的对象结构都克隆。

在代码中可以看出,重写clone方法时,利用了对象序列化的转换而达到的克隆效果,实际此代码并没将对象状态写入永久文件,而是将代码在内存中以Byte的类型进行了一次转换(写入及读取)。

实际测试调用效果便可知道,浅克隆及深克隆的特点。

 

下面来实现一个小的示例需求:

 

在四大名著《西游记》中,孙悟空是上入天下入地,可九天揽月,可下海捉鳖的狠人物。其中一大技能“身外化身”,再加手中的“金箍棒”谁人敢热。“单挑有神器,群殴叫兄弟”。

 

分身术相当的真实,即使再真实,也是分身,不是原型。因而这一技能,我们便可以用“原型模式”来表示出来。

先建立一个猴子类(Monkey),当然要由分身的技能(clone)。

当我们用浅克隆的时候,分身成功体现出来了,但是,猴子用的金箍棒是始终没有克隆。

这样的结果将会是,分身出多个个猴子都在使用一个金箍棒(GoldRingeStaff)。

所以要真正能够达到“猴手一个金箍棒”就需要使用深克隆的方式来解决。

 

“打群架”的孙悟空,“猴手一根金箍棒”

 

 在实际应用中,每当克隆出猴子一个分身,连带金箍棒也一并克隆了。

“原型模式”是利用clone(克隆)的形式复制出对象,属于创建对象的一种方法。

此篇结束后,加上前面所说的“工厂方法、抽象工厂、单例、建造者”,在23中设计模式中,创建型模式均已介绍完,希望大家能快速理解及应用。


以上就是今日分享,如果你喜欢记得点赞收藏哦,以防找不到我! 


http://www.ppmy.cn/news/5149.html

相关文章

【数据结构】树和二叉树

半山腰很挤,你得去山顶看看 目录 1.树 1.1 树的概念 1.2 树的特征 1.3 树每个结点的关系 1.4 树的表示形式 2.二叉树 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储 2.5 二叉树的基本操作 2.5.1 判断二叉树是否为空 2.…

手撕红黑树的构建与验证

上篇文章我们介绍了AVL树的构建与适用场景,我们知道了AVL树虽然查找效率很高,但是不适合频繁插入或删除的场景。为了解决这个问题又诞生了新的数据结构:红黑树 那么本篇文章就着重介绍红黑树的性质与如何构建。 1.红黑树的性质 1.结点颜色非黑…

三子棋超详细解说,人机大战,PVP玩家对战

目录 🐒三子棋的基本功能构思 🐎 STEP 1 : 设计游戏菜单 🐎 STEP 2 : 初始化游戏棋盘 🐎 STEP 3 : 游戏功能函数的封装 🐆功能一:人机对战 🐆功能二:PVP玩家对战 🐆功能三…

RabbitMQ之Exchange(交换机)

目录 一、Exchange简介 二、Exchange(交换机)的类型 1.直连交换机:Direct Exchange 2.主题交换机:Topic Exchange 3.扇形交换机:Fanout Exchange 4、默认交换机 5、Dead Letter Exchange(死信交换机) 三、交换机…

sentinel-1.8.6 基于生产实践遇到的坑

最近基于sentinel-1.8.6搭建了一套供生产使用。在开发的过程中遇到了一些问题并进行了改造,在此记录一下。 1、http访问支持ip级别限流 如果是基于servlet容器的,可以手动复制com.alibaba.csp.sentinel.adapter.servlet.CommonFilter,自定义一个filter…

Transformer17

还是transformer 这次还是谷歌哈 又在机器人领域发力 谷歌机器人团队等在机器人领域构建了一个多任务 transformer 模型,显著改进了对新任务、环境和对象的零样本泛化。轻松完成700多条指令、成功率达97%!谷歌开源机器人领域 我们知道,机器…

MySQL 55题及答案【八】

1.数据库三范式是什么? 1. 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系 统都满足第一范式数据库表中的字段都是单一属性的,不可再分) 2. 第二范式(2NF)是在第一范式(1NF&a…

Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)

程序示例精选 QtC基本绘图(画线,圆,矩形画线) 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对《QtC基本绘图(画线,画圆,矩形, 撤销&am…