创造型模式-原型模式(场景体验-》方案解决===代码图解)

这篇具有很好参考价值的文章主要介绍了创造型模式-原型模式(场景体验-》方案解决===代码图解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创建重复对象-场景体验

  今天来一个大客户,他要求帮他下100个订单。每个订单除了用户ID,和用户名不同之外,其他个人信息完全相同。

订单类
public class Order{
	//id 主键,无实际意义
	private String id;
	//订单编号
	private String orderNo;
	//产品编码
	private String productNo;
	//产品名称
	private String productName;
	//产品类型
	private String productType;
	//订单购买数量
	private Integer num;
	//用户id
	private String userId;
	//用户名称
	private String userName;
	//用户电话号码
	private String tel;
	//用户住址
	private String address;
	//购买店铺,用于识别改订单是在哪一个店铺下的单。
	private Store store;
}
//商店类
public class Store{
	//店铺id
	private String id;
	//店铺名称
	private String name;
	//店铺负责人
	private String head;
	//店铺地址
	private Strign address;
}

制造数据:

public void copyOrder(){
	//专卖店
	Store store = new Store();
	store.setId("dp001");
	store.setName("地球村专卖店");
	store.setHead("村长");
	store.setAddress("东风东街001号");
	
	//第一个订单
	Order order = new Order();
	order.setId("111111");
	order.setOrderNo("dd001");
	order.setProductNo("cp001");
	order.setProductName("产品1");
	order.setProductType("工具类");
	order.setNum(50);
	order.setUserId("U001");
	order.setUserName("用户1");
	order.setTel("17660887362");
	order.setAddress("地球村-种花家");
	order.setStore(store);
	//第二个订单
	Order order1 = new Order();
	order.setId("111112");
	order.setOrderNo("dd002");
	order.setProductNo(order.getProductNo());
	order.setProductName(order.getProductName());
	order.setProductType(order.getProductType());
	order.setNum(order.getNum());
	order.setUserId("U002");
	order.setUserName("用户2");
	order.setTel(order.getTel());
	order.setAddress(order.getAddress());
	order.setStore(store);
	...
	还要100}

  上面的代码就是现状,当然也可以使用构造方法,但是过程都是一样的需要大量重复的代码。非常不美观。

解决方案(原型模式)

原型模式可以理解为:将一个完整对象的复制创建过程抽离成一个方法,使我们要创建一个相同对象的时候不需要再依次赋值。
模拟底层实现:

public class Order{
	//id 主键,无实际意义
	private String id;
	//订单编号
	private String orderNo;
	//产品编码
	private String productNo;
	//产品名称
	private String productName;
	//产品类型
	private String productType;
	//订单购买数量
	private Integer num;
	//用户id
	private String userId;
	//用户名称
	private String userName;
	//用户电话号码
	private String tel;
	//用户住址
	private String address;
	//购买店铺,用于识别改订单是在哪一个店铺下的单。
	private Store store;
	public Order clone(){
        Order order1 = new Order();
        order1.setId(this.id);
        order1.setOrderNo(this.orderNo);
        order1.setProductNo(this.productNo);
        order1.setProductName(this.productName);
        order1.setProductType(this.productType);
        order1.setNum(this.num);
        order1.setUserId(this.userId);
        order1.setUserName(this.userName);
        order1.setTel(this.tel);
        order1.setAddress(this.address);
        order1.setStore(this.store);
        return order1;
    }
	
}

我们使用的时候:


public void copyOrder(){
	//专卖店
	Store store = new Store();
	store.setId("dp001");
	store.setName("地球村专卖店");
	store.setHead("村长");
	store.setAddress("东风东街001号");

	//第一个订单
	Order order = new Order();
	order.setId("111111");
	order.setOrderNo("dd001");
	order.setProductNo("cp001");
	order.setProductName("产品1");
	order.setProductType("工具类");
	order.setNum(50);
	order.setUserId("U001");
	order.setUserName("用户1");
	order.setTel("17660887362");
	order.setAddress("地球村-种花家");
	order.setStore(store);
	//第二个订单
	Order order1 = order.clone();
	order.setId("111112");
	order.setOrderNo("dd002");
	order.setUserId("U002");
	order.setUserName("用户2");
	...
	之后的100个相同
}

通过上述方法使原本赋值操作的工作量大量减少,只需要关注自己个性化的赋值即可。
上面的clone方法是完全我自己写的用来模拟的,Java为我们提供了更好的实现,不需要我们去做上面无聊的赋值工作:
只需要Order类实现Cloneable接口,重写clone方法,在这个方法里面调用supper.clone()方法就好了。

public class Order{
	//id 主键,无实际意义
	private String id;
	//订单编号
	private String orderNo;
	//产品编码
	private String productNo;
	//产品名称
	private String productName;
	//产品类型
	private String productType;
	//订单购买数量
	private Integer num;
	//用户id
	private String userId;
	//用户名称
	private String userName;
	//用户电话号码
	private String tel;
	//用户住址
	private String address;
	//购买店铺,用于识别改订单是在哪一个店铺下的单。
	private Store store;
	@Override
    public Order clone(){
        Order order1 = new Order();
        try {
            order1 = (Order) super.clone();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        return order1;
    }
}

  有兴趣的未来大佬们可以去看一下clone的源码,这里用的super.clone()是Object中的clone方法。这个方法是native的方法(本地方法)。Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成,而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。用native修饰,即表示操作系统,需要提供此方法,Java本身需要使用。
  clone主要做的就是开创新的空间,将原对象的数据复制过去,再给返回引用。在Java里面所有的类如果重写clone方法就都是个性化的处理了。但是需要注意的是这个native的clone是浅拷贝。也就是在对象中还有对象的话,内部的对象clone之后还是原来的对象。

以咱们的代码举例:
  在Order类中有一个属性是Store的实例。在上面的clone执行之后如果改变clone之后的实例中的store属性,原本的order中的store属性也会改变。
在上面“copyOrder”代码的最后一行增加如下:

		System.out.println("order2"+order1);
        System.out.println("order:"+order);
        System.out.println("改变前order1:"+order1.getStore());
        System.out.println("改变前order:"+order.getStore());
        order1.getStore().setAddress("地球村-鹰酱家门头房");
        System.out.println("改变后order1:"+order1.getStore());
        System.out.println("改变前order:"+order.getStore());

创造型模式-原型模式(场景体验-》方案解决===代码图解),# 设计模式,原型模式,java,开发语言
可以看到,我们只改变了order1实例中store的address属性,但是order的对应属性也跟着一起变了。

如何解决上面的浅拷贝?

原型模式定义

  原型模式(Prototype Pattern)用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。

  这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

定义是引用自:菜鸟教程-原型模式文章来源地址https://www.toymoban.com/news/detail-606284.html

到了这里,关于创造型模式-原型模式(场景体验-》方案解决===代码图解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FluentFTP实战:轻松操控FTP文件,创造高效传输体验

      概述: 通过FluentFTP库,轻松在.NET中实现FTP功能。支持判断、创建、删除文件夹,判断文件是否存在,实现上传、下载和删除文件。简便而强大的FTP操作,提升文件传输效率。 在.NET中,使用FluentFTP库可以方便地实现FTP的相关功能。以下是判断文件夹是否存在、文件夹的创建

    2024年02月19日
    浏览(28)
  • 前端用户体验设计:创造卓越的用户界面和交互

    💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 用户体验(User Experience,UX)是前端开发中至关重要的一环。一个优秀的用户体验

    2024年02月04日
    浏览(33)
  • ❤️创意网页:创造精彩的登录体验-3D翻转登录页面

    ✨ 博主: 命运之光   🌸 专栏: Python星辰秘典 🐳 专栏: web开发(简单好用又好看) ❤️ 专栏: Java经典程序设计 ☀️ 博主的其他文章: 点击进入博主的主页 前言: 欢迎踏入我的Web项目专栏,一段神奇而令人陶醉的数字世界! 🌌 在这里,我将带您穿越时空,揭开属于

    2024年02月16日
    浏览(47)
  • 动态贴纸、美颜SDK与AR:创造独特的互动体验

    目前,动态贴纸、美颜SDK、增强现实(AR)等技术是比较热门的话题,它们所结合的新兴玩法更是收到大家推崇,正潜移默化的改变我们与数字世界互动的方式。 一、动态贴纸:个性化互动的开始 动态贴纸,可以在实时视频或照片中添加虚拟元素,如面具、耳朵、花朵等。这

    2024年02月09日
    浏览(35)
  • Web3区块链游戏:创造虚拟世界的全新体验

    随着区块链技术的不断发展,Web3区块链游戏正逐渐崭露头角,为玩家带来了全新的虚拟世界体验。传统游戏中的中心化结构和封闭经济体系已经被打破,取而代之的是去中心化的游戏环境和真实所有权的数字资产。本文将深入探讨Web3区块链游戏的特点、优势以及对玩家和游

    2024年02月21日
    浏览(31)
  • 全球网友元宵一起创作赏月图,体验百度文心大模型AIGC创造力

    2月15日元宵节,在共青团中央宣传部、国家航天局探月与航天工程中心指导下,中国青年报社联合百度共同推出“天下共元宵”线上互动活动。互动以“嫦娥一号”传回的首张全月影像图为原型,使用AI生成个性化画作,让千万网友首次直观体验到百度文心大模型的AIGC(AI

    2024年02月12日
    浏览(27)
  • “优化”城市出行体验——山海鲸智慧交通解决方案

    随着城市化进程的不断加速,城市交通问题也变得日益严重。为了改善城市交通体验、提高出行效率以及减少交通拥堵和环境污染。 山海鲸可视化 打造城市智慧交通系列解决方案模板,解决方案以“ 数字 孪生 技术 ”为核心,通过数据分析、人工智能和物联网技术来优化城

    2024年02月07日
    浏览(37)
  • 音视频解决方案(一):秀场直播场景化方案

    秀场直播场景为社交娱乐模式下的视频互动场景,场景支持多人视频连麦互动,更容易吸引用户参与连麦互动,提升用户的消费意愿及粘性。 产品功能目前是推流到 ZEGO 音视频云服务,观众再从 ZEGO 音视频云服务进行拉流,同时主播与观众之间连麦也是通过 ZEGO 音视频云服务

    2024年02月01日
    浏览(35)
  • 音视频解决方案(一):在线KTV场景方案

    在线 KTV 是社交娱乐场景下的新型互动玩法,通过歌曲把人与人连接起来,让沟通破冰变得更简单,有效提升平台用户停留时长。 在线 KTV 玩法有很多种,按照形式主要由以下几种: 排麦独唱:观众上麦后可以进行点歌排麦等待,歌曲开始播放后即可进行独唱。 实时合唱:两

    2024年01月24日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包