问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

23种设计模式漫画版系列—原型模式

发布网友 发布时间:2024-10-06 01:19

我来回答

1个回答

热心网友 时间:2024-10-08 03:39

01

意图

原型模式亦称:克隆、Clone、Prototype

原型模式是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。

02

问题

如果你有一个对象,并希望生成与其完全相同的一个复制品,你该如何实现呢?首先,你必须新建一个属于相同类的对象。然后,你必须遍历原始对象的所有成员变量,并将成员变量值复制到新对象中。

不错!但有个小问题。并非所有对象都能通过这种方式进行复制,因为有些对象可能拥有私有成员变量,它们在对象本身以外是不可见的。

“从外部”复制对象并非总是可行。

直接复制还有另外一个问题。因为你必须知道对象所属的类才能创建复制品,所以代码必须依赖该类。即使你可以接受额外的依赖性,那还有另外一个问题:有时你只知道对象所实现的接口,而不知道其所属的具体类,比如可向方法的某个参数传入实现了某个接口的任何对象。

03

解决方案

原型模式将克隆过程委派给被克隆的实际对象。模式为所有支持克隆的对象声明了一个通用接口,该接口让你能够克隆对象,同时又无需将代码和对象所属类耦合。通常情况下,这样的接口中仅包含一个克隆方法。

所有的类对克隆方法的实现都非常相似。该方法会创建一个当前类的对象,然后将原始对象所有的成员变量值复制到新建的类中。你甚至可以复制私有成员变量,因为绝大部分编程语言都允许对象访问其同类对象的私有成员变量。

支持克隆的对象即为原型。当你的对象有几十个成员变量和几百种类型时,对其进行克隆甚至可以代替子类的构造。

预生成原型可以代替子类的构造。

其运作方式如下:创建一系列不同类型的对象并不同的方式对其进行配置。如果所需对象与预先配置的对象相同,那么你只需克隆原型即可,无需新建一个对象。

04

真实世界类比

现实生活中,产品在得到大规模生产前会使用原型进行各种测试。但在这种情况下,原型只是一种被动的工具,不参与任何真正的生产活动。

一个细胞的分裂。

由于工业原型并不是真正意义上的自我复制,因此细胞有丝分裂(还记得生物学知识吗?)或许是更恰当的类比。有丝分裂会产生一对完全相同的细胞。原始细胞就是一个原型,它在复制体的生成过程中起到了推动作用。

05

原型模式结构

基本实现原型注册表实现

06

伪代码

在本例中,原型模式能让你生成完全相同的几何对象副本,同时无需代码与对象所属类耦合。

克隆一系列位于同一类层次结构中的对象。

所有形状类都遵循同一个提供克隆方法的接口。在复制自身成员变量值到结果对象前,子类可调用其父类的克隆方法。

07

原型模式适合应用场景

如果你需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式。

这一点考量通常出现在代码需要处理第三方代码通过接口传递过来的对象时。即使不考虑代码耦合的情况,你的代码也不能依赖这些对象所属的具体类,因为你不知道它们的具体信息。

原型模式为客户端代码提供一个通用接口,客户端代码可通过这一接口与所有实现了克隆的对象进行交互,它也使得客户端代码与其所克隆的对象具体类独立开来。

如果子类的区别仅在于其对象的初始化方式,那么你可以使用该模式来减少子类的数量。别人创建这些子类的目的可能是为了创建特定类型的对象。

在原型模式中,你可以使用一系列预生成的、各种类型的对象作为原型。

客户端不必根据需求对子类进行实例化,只需找到合适的原型并对其进行克隆即可。

08

实现方式

1. 创建原型接口,并在其中声明克隆方法。如果你已有类层次结构,则只需在其所有类中添加该方法即可。

2. 原型类必须另行定义一个以该类对象为参数的构造函数。构造函数必须复制参数对象中的所有成员变量值到新建实体中。如果你需要修改子类,则必须调用父类构造函数,让父类复制其私有成员变量值。

如果编程语言不支持方法重载,那么你可能需要定义一个特殊方法来复制对象数据。在构造函数中进行此类处理比较方便,因为它在调用new运算符后会马上返回结果对象。

3. 克隆方法通常只有一行代码:使用new运算符调用原型版本的构造函数。注意,每个类都必须显式重写克隆方法并使用自身类名调用new运算符。否则,克隆方法可能会生成父类的对象。

4. 你还可以创建一个中心化原型注册表,用于存储常用原型。

你可以新建一个工厂类来实现注册表,或者在原型基类中添加一个获取原型的静态方法。该方法必须能够根据客户端代码设定的条件进行搜索。搜索条件可以是简单的字符串,或者是一组复杂的搜索参数。找到合适的原型后,注册表应对原型进行克隆,并将复制生成的对象返回给客户端。

最后还要将对子类构造函数的直接调用替换为对原型注册表工厂方法的调用。

09

原型模式优缺点

10

Python、Go、Java 代码示例

详见次条文章

11

推荐UML实用工具

亿图图示

关注公众号:全栈芬达,回复:亿图图示,获取激活版。

Visio

12

UML 类图关系

UML类图非常简单,可以用下面的图表示一个类:

该图表示一个叫做Person的类,该类有name、age、sex三个private属性,每个属性的类型紧跟在冒号的后面。该类有walk和speak两个方法,其中walk方法是public的,而speak方法是protected的,两个方法的返回值类型紧跟在冒号的后面。

如果要表示一个接口,则用下面的图表示:

下面介绍类与类之间的关系。如果按照关系的紧密程度从弱到强划分,类与类之间的关系包括:

依赖关系

依赖关系是所有类间关系中最弱的一种,它用下面的图表示:

图中的箭头方向表示依赖的方向,上图表示类A依赖类B。

依赖,顾名思义表示一个实体的存在必须依赖另一个实体的存在。可以这样认为,如果类A依赖类B,那么类A只有在类B存在的情况下,才能编译通过。

下面代码是依赖的一个例子:

在这段代码,UserController类同时依赖于UserService和User两个类,可以用下面的类图表示它们的依赖关系:

可见依赖关系大量的存在于我们的代码中,但千万不要在项目设计时将全部的依赖关系都画出来,这不仅很累,而且也没有必要。当梳理依赖关系时,先要搞清楚你关注什么,想表达什么,只画出真正需要画的就可以。

关联关系

关联关系表示两个实体间存在一定的联系,这种联系比依赖关系更紧密,不仅仅只是“两个实体触碰到”这样松散的关系。例如Student和School这两个类,一个学生一定会有一个对应的学校,那么Student和School间就存在关联关系,且它们的关系是一对多的。

用下面的UML图表示:

关联关系也可以用于领域建模,例如要设计一个骰子游戏,游戏者连续投掷两次筛子,如果两次点数的总数是7,则游戏者赢,否则游戏者输。可以用下面UML图对这个问题进行领域建模,各实体间使用的就是关联关系。这也是关联关系的一种特殊用法。

聚合&组合

聚合也是一种关联关系,但是这种关联关系存在整体与部分的语义。例如大雁和大雁群,一只大雁是整个大雁群的一部分。这就是一种聚合关系,具有has-a的语义。下面的UML图用来描述聚合关系。

组合是一种强聚合关系,它表示整体和部分之间具有相同的生命周期,同生共死。例如鸟和翅膀,鸟如果死掉了,那么它的翅膀也会跟着死掉。组合关系具有contains-a的语义。下面的UML图用于表达组合关系。

记忆聚合和组合UML图画法的小技巧:菱形就相当于一个容器,容器指向的实体就是整体,所以上面图中的菱形分别指向大雁群和鸟。此外,由于组合关系的紧密程度比聚合关系更强,所以组合关系用实心菱形,聚合关系用空心菱形。

继承&实现

继承和实现都是Java中的基础,比较容易理解,它们是类与类之间关系最强的。分别用下面的UML图表示。

继承示例:

实现示例:

PS:实现关系应该用空心箭头。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
...一个戴耳机 一个拿饭勺 是出自哪部漫画!!!??? 动感新势力47期CD封面上的人物是哪一部动画 帮忙听下这是哪部动画里的插曲! 如何看懂空调参数 RabbitMQ初学者入门 mq语言是什么 二消改造消防规范 申报消防需要些什么图纸啊 在中国农业银行整取整存5万,存二年利息是多少? 五万元存两年农业银行利息是多少给 的是卡还是存款单 设计模式之InterpreterPattern解释器模式的ppt 软文发布软文的定义 在淘宝之前用一个手机号开店,之后注销,用另一个手机号能申请开店... ...进行认证吗?用的千牛软件,做过客服的亲你们也要用自己的身份证... 在天猫买的电信流量网卡用自己身份证办的 流量用完卡没用了对以后使用... 小学国旗下献辞:做一个热爱劳动热爱生活的人 蜂蜜食用指南 重庆唐氏蜂业有限公司食用方法 火影忍者里的鸣人带给人值得学习的地方有哪些?他给人的启发是什么? 云南曲靖有什么习俗 铃仙·优昙华院·稻叶二次设定 东方project中铃仙跟红美玲是什么关系? 罚抄语文课文,怎么样写的快。有什么好办法? 又被罚抄了,有什么方法可以快点抄完啊。用复写纸的免谈。 梦到去她家见爸妈被拒绝 梦到见女朋友家人,她妈妈还带我去她家菜地走一圈 违约责任免除的法定事由是什么 电脑没有网。网络连接符号有一个黄色感叹号,什么原因?怎么解决?是win7... ...连不上家里的无线网络了,右下角的无线网络 符号上有个小的黄色的感 ... 行政拘留期间与起始时间和执行日期的问题 买了一台爱普生l351,黑墨水用完了,想在想加, 我家的打印机爱普生L351打印出来的文件是这样的(如图),打印喷头清 2022年12月15日是打官司的黄道吉日吗 2022年12月15日是打官司吉日吗 .rp文件用什么文件怎么打开 axure发布之后ctrl+s生成源文件,为什么没有HTML文件,只能打开源文件才可... 为什么iphone5s连wifi偶尔会掉线 天天象棋战国七雄第238关怎么过 “嘴上摸着密肚里装着一把剑”,打一成语 从PowerPointDesigner看微软的AI设计思维 C语言中的&n是神马意思谢谢了,大神帮忙啊 用C语言编程 输出斐波那契数列的第42项谢谢了,大神帮忙啊 拥抱太阳的月亮怎么查出害烟雨的凶手的?? 我的世界电脑版怎么打指令?(最好有图片) 我的世界在哪输指令啊? 圣莫里茨两届冬季奥运会 中学生日记340字寒假急求 我要寒假日记,340字,可以多,最多少10个字,只要3篇,写的好,我加悬赏分... 不干咳不恶心干呕,也不吸烟喝酒。就是喉咙干痒要咳咳咳,是咽炎还是上 ... 喉咙中有异物,刷牙时会恶心 ...手机控制Arduino?哪位大神知道啊,还有Arduino控制板有些什么要求...
  • 焦点

最新推荐

猜你喜欢

热门推荐