【资料图】
本文主要讲述原型模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。
一.什么是原型模式原型模式是23种设计模式中创建型模式的一种,它关注的是用一个已经存在的实例对象作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。
二.生活中的原型模式1.孙悟空孙悟空有独一无二的法宝如意金箍棒和众多法术,其中有一个名为身外身法的道术,孙悟空拔身上的毛幻化出另一个自己,这个大家应该有印象吧,这个幻化出新的分身就跟设计模式中的原型模式很相似。
2.哪吒哪吒不管是西游记还是封神榜中都出现过,也是江帅所喜欢的中国神话人物之一,哪吒虽然没有孙悟空会身外身法,但是他会三头六臂,通过这个法术,哪吒会变换出2个新的头颅和2对新的手臂,而这个三头六臂是以头或者手臂为参照物变化出来的,就跟设计模式中的原型模式很相似。
3.漩涡鸣人旋涡鸣人是日本漫画中火影忍者的人物,影分身之术是他最厉害的忍术之一。这个忍术是能够变幻出多个相同的自己,以自己为参照物根据查克拉的量来变幻出不同的数量,这就跟设计模式中的原型模式很相似。
三.原型模式的实现接下来江帅以孙悟空的身外身法之术来举例,通过原型模式来实现。先创建一个武器类,再创建一个孙悟空的类并实现克隆接口
package com.qianfeng.ran;/** @author:江帅* 孙悟空类*/public class SunWuKong implements Cloneable{ //名字 private String name; //武器 private Weapon weapon; public SunWuKong() { } public SunWuKong(String name, Weapon weapon) { this.name = name; this.weapon = weapon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Weapon getWeapon() { return weapon; } public void setWeapon(Weapon weapon) { this.weapon = weapon; } @Override public String toString() { return "SunWuKong{" + "name="" + name + """ + ", weapon=" + weapon + "}"; } //身外身之术 @Override protected Object clone() throws CloneNotSupportedException { //通过 Object 类的 clone() 克隆出新的孙悟空 SunWuKong sunWuKong = (SunWuKong)super.clone(); //新的分身名等同当前名 sunWuKong.setName(name); //新的分身手持同样的武器,但为新的对象 sunWuKong.setWeapon(new Weapon(weapon.getName(),weapon.getSource())); return sunWuKong; }}/* * @author:江帅 * 武器类 */public class Weapon { //武器名 private String name; //来源 private String source; public Weapon() { } public Weapon(String name, String source) { this.name = name; this.source = source; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } @Override public String toString() { return "Weapon{" + "name="" + name + """ + ", source="" + source + """ + "}"; }}
最后通过原型模式来创建孙悟空的分身。
package com.qianfeng.ran;/* * @author:江帅 * 客户端 */public class Demo { public static void main(String[] args) throws CloneNotSupportedException { //phantom //创建孙悟空对象,拥有东海龙宫的如意金箍棒 SunWuKong sunWuKong = new SunWuKong("孙悟空",new Weapon("如意金箍棒","东海龙宫")); //调用克隆方法创建2个分身 -- 身外身之术 SunWuKong phantom1 = (SunWuKong)sunWuKong.clone(); SunWuKong phantom2 = (SunWuKong)sunWuKong.clone(); //执行结果: //SunWuKong{name="孙悟空", weapon=Weapon{name="如意金箍棒", source="东海龙宫"}} System.out.println(sunWuKong.toString()); //执行结果: //SunWuKong{name="孙悟空", weapon=Weapon{name="如意金箍棒", source="东海龙宫"}} System.out.println(phantom1.toString()); //执行结果: //SunWuKong{name="孙悟空", weapon=Weapon{name="如意金箍棒", source="东海龙宫"}} System.out.println(phantom2.toString()); //改变分身的武器和出产地 phantom1.getWeapon().setName("芭蕉扇"); phantom1.getWeapon().setSource("火焰山"); phantom2.getWeapon().setName("紫金红葫芦"); phantom2.getWeapon().setSource("太上老君"); //执行结果: //SunWuKong{name="孙悟空", weapon=Weapon{name="如意金箍棒", source="东海龙宫"}} //执行结果: System.out.println(sunWuKong.toString()); //执行结果: //SunWuKong{name="孙悟空", weapon=Weapon{name="芭蕉扇", source="火焰山"}} System.out.println(phantom1.toString()); //执行结果: //SunWuKong{name="孙悟空", weapon=Weapon{name="紫金红葫芦", source="太上老君"}} System.out.println(phantom2.toString()); }}
四.总结在Java中克隆新的对象会产生相同的引用,改变克隆对象的内容会改变到原型对象,这个属于浅拷贝,就像咱们的案例,如果用的是浅拷贝,打印结果会是3个武器都是来自太上老君的紫金红葫芦。
而使用原型模式克隆出来的对象则跟原型对象不是同一个地址,改变克隆对象不会影响原型对象,这个属于深拷贝,如案例所示每个对象里的内容不会因为别的对象的改变而改变。
下一章,将带大家学习市场供需关系(设计模式之生产者和消费者模式)。
为您推荐
- (2023-06-07)行业景气观察(0607):家电、家居等618预售开门红 5月重卡出口保持强劲
- (2023-06-07)ETF日报
- (2023-06-07)孩子王(301078):KIDSGPT赋能提升运营能力 华北区域仓网建设助力全国仓网布局 世界新资讯
- (2023-06-07)报喜鸟(002154):4Q22受疫情影响 2023年有望重启开店
- (2023-06-07)滚动:惠泉啤酒(600573):受益于股东燕京啤酒改革 提效与高端化正蓄力
- (2023-06-07)资本新秩序系列(二):从增长率到股息率|环球最新
- (2023-06-07)世界热文:华丰科技(688629)新股覆盖研究
最近更新
- (2023-06-08)如何以孙悟空七十二变去理解原型模式?
- (2023-06-08)2023年川渝地区铁路建设劳动竞赛启动
- (2023-06-08)世界要闻:广东省商务厅张劲松:广东自贸试验区累计新设企业超过26万家 实际利用外资近500亿美元
- (2023-06-08)中国5月外汇储备31765.1亿美元|今日讯
- (2023-06-08)大姚县气象台发布雷电黄色预警信号【Ⅲ级/较重】【2023-06-07】
- (2023-06-08)库克回应Vision Pro价格昂贵:这是“最先进的电子设备”
- (2023-06-08)全球热消息:海关总署:前5个月民营企业进出口总额同比增长13.1%
- (2023-06-08)12年一个周期叫什么_12年一个轮回叫什么
- (2023-06-08)天天讯息:罗博特科06月07日大涨,股价创历史新高
- (2023-06-08)当前热讯:郭布罗婉容成仙了么_郭布罗婉容
- (2023-06-08)直击高考首日!九江少年,加油! 环球看点
- (2023-06-08)【聚看点】网络原来如此之防火墙应用网关技术
- (2023-06-08)理想汽车北京顺义工厂最早7月投产?官方回应:确实在积极准备中
- (2023-06-08)甘肃省美食产业发展现场会暨临夏美食节各项筹备工作有序推进_全球热门
- (2023-06-08)世界关注:外交部:对卡霍夫卡水电站堤坝被破坏表示严重关切
- (2023-06-07)海南橡胶:公司未参与投资海南万宁免税店项目_环球关注
- (2023-06-07)环球热议:商企携手助力“三夏” 促丰收
- (2023-06-07)全球今头条!小学生“脏”请假条走红,原因让人忍俊不禁,老师用六个字霸气回应
- (2023-06-07)天天快资讯:断面图和剖面图的区别图片_断面图和剖面图的区别
- (2023-06-07)世界快报:新旧动能顺畅切换,中德企业探索可持续发展合作
- (2023-06-07)湖北宜昌可提供海尔饮水设备维修服务地址在哪
- (2023-06-07)通达创智:现已开发、销售适合儿童使用的相关产品_快看
- (2023-06-07)世界观热点:冬至吃饺子寓意什么_吃饺子寓意什么
- (2023-06-07)重庆便宜的大专院校排名 重庆学校大专排名_焦点播报
- (2023-06-07)热门看点:隔离开关的作用和特点_隔离开关的作用
- (2023-06-07)【全球新视野】今日美盘英镑/美元操作策略分析(2023年6月7日)
- (2023-06-07)视点!重庆建筑科技职业学院教务处组织召开2022年年检工作教育教学专题复盘会
- (2023-06-07)环球快讯:广西壮族自治区富川瑶族自治县发布大风蓝色预警
- (2023-06-07)三亚旅文集团8亿元中期票据将付息 利率4.27%
- (2023-06-07)抖音回应扩张自营电商:将根据用户需求做一些业务尝试 每日讯息