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

创造型模式-原型模式

  • 创建重复对象-场景体验
  • 解决方案(原型模式)
  • 原型模式定义

创建重复对象-场景体验

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

订单类
public class Order{//id 主键,无实际意义private String id;//订单编号private String orderNo;//产品编码private String productNo;//产品名称private String productName;//产品类型private String productType;//订单购买数量private Integer num;//用户idprivate String userId;//用户名称private String userName;//用户电话号码private String tel;//用户住址private String address;//购买店铺,用于识别改订单是在哪一个店铺下的单。private Store store;
}
//商店类
public class Store{//店铺idprivate 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;//用户idprivate 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;//用户idprivate String userId;//用户名称private String userName;//用户电话号码private String tel;//用户住址private String address;//购买店铺,用于识别改订单是在哪一个店铺下的单。private Store store;@Overridepublic 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());

在这里插入图片描述
可以看到,我们只改变了order1实例中store的address属性,但是order的对应属性也跟着一起变了。

如何解决上面的浅拷贝?

原型模式定义

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

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

定义是引用自:菜鸟教程-原型模式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多层感知机

模型 多层感知机原理上等同叠加多个全连接层,只不过在两个全连接层之间,会将第一个全连接层的输出加上激活函数,没有激活函数的话,多个全连接层等同一个全连接层效果,因为全连接层等同一个矩阵,两个矩阵相乘…

Android Dalvik 虚拟机(详细版)

经典好文推荐,通过阅读本文,您将收获以下知识点: 1.Java 语言在Android 上运行流程 2.虚拟机发展过程 3.Android Dalvik 模式 4.Android N 中dex2oat 原理以及模式 5.如何判断dex2oat 采用的相关参数 6.如何查看dex2oat 的log 7.什么时候进行dex2oat 8.手机反应慢的原因 9.解…

uni-app 经验分享,从入门到离职(一)——初始 uni-app,快速上手(文末送书福利1.0)

文章目录 📋前言🎯什么是 uni-app🎯创建第一个 uni-app 项目🧩前期工作🧩创建项目(熟悉默认项目、结构)🧩运行项目 📝最后🎯文末送书🔥参与方式 &…

力扣1114.按序打印-----题目解析

题目描述 解析: class Foo {public int a 0;public Foo() {}public void first(Runnable printFirst) throws InterruptedException {// printFirst.run() outputs "first". Do not change or remove this line.printFirst.run();a;}public void second…

Ip-Limit: 轻量级注解式IP限流组件(二)

author: van , ggfanwentaogmail.comIp-Limit-Example: 轻量级注解式IP限流组件使用样例 项目简介 该项目为ip-limiter的使用示例项目。 ip-limiter地址: https://github.com/DDAaTao/ip-limiter 示例项目文件树 └─example├─handler│ └─BaseException…

基于OpenCV的红绿灯识别

基于OpenCV的红绿灯识别 技术背景 为了实现轻舟航天机器人实现红绿灯的识别,决定采用传统算法OpenCV视觉技术。 技术介绍 航天机器人的红绿灯识别主要基于传统计算机视觉技术,利用OpenCV算法对视频流进行处理,以获取红绿灯的状态信息。具…

甘特图 Dhtmlx Gantt

介绍 在一些任务计划、日程进度等场景中我们会使用到甘特图,Dhtmlx Gantt 对于甘特图的实现支持很友好,文档API介绍全面,虽然增强版的收费,但免费版的足以够用。 官网:https://docs.dhtmlx.com/gantt/ 安装dhtml gannt…

Linux6.16 Docker consul的容器服务更新与发现

文章目录 计算机系统5G云计算第四章 LINUX Docker consul的容器服务更新与发现一、consul 概述1.什么是服务注册与发现2.什么是consul 二、consul 部署1.consul服务器2.registrator服务器3.consul-template4.consul 多节点 计算机系统 5G云计算 第四章 LINUX Docker consul的…

PHP数组转对象和对象转数组

PHP数组转对象和对象转数组 <?php function array_to_object($arr){$obj new stdClass();foreach ($arr as $key > $val) {if (is_array($val) || is_object($val)) {$obj->$key array_to_object($val);} else {$obj->$key $val;}}return $obj; } function o…

项目文档管理的基本指南

项目文档是一种关键的项目管理资源&#xff0c;它可以提供清晰度&#xff0c;保证参与项目的每个人都在同一页面上&#xff0c;从而确保项目按时、按预算完成。 本文将讨论项目文档的重要性、如何在项目中使用项目文档以及选择好合适的项目文档管理软件的技巧。 什么是项目文…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、我…

DevOps-Git

DevOps-Git 版本控制软件提供完备的版本管理功能&#xff0c;用于存储&#xff0c;追踪目录&#xff08;文件夹&#xff09;和文件的修改历史。版本控制软件的最高目标是支持公司的配置管理活动&#xff0c;最终多个版本的开发和维护活动&#xff0c;即使发布软件。 git安装 h…

K8S初级入门系列之十二-计算资源管理

一、前言 K8S集群中着这各类资源&#xff0c;比如计算资源&#xff0c;API资源等&#xff0c;其中最重要的是计算资源&#xff0c;包括CPU&#xff0c;缓存&#xff0c;存储等。管理这些资源就是要在资源创建时进行约束和限制&#xff0c;在运行时监控这些资源的指标&#xff0…

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLA…

idea中创建请求基本操作

文章目录 说明效果创建GET请求没有参数带有参数带有环境变量带有动态参数 说明 首先通过###三个井号键来分开每个请求体&#xff0c;然后请求url和header参数是紧紧挨着的&#xff0c;请求参数不管是POST的body传参还是GET的parameter传参&#xff0c;都是要换行的&#xff0c;…

OSI模型简介及socket,tcp,http三者之间的区别和原理

1.OSI模型简介&#xff08;七层网络模型&#xff09; OSI 模型(Open System Interconnection model)&#xff1a;一个由国际标准化组织提出的概念模型&#xff0c;试图提供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。 它将计算机网络体系结构划分为七层,每…

苹果safari浏览器播放不了video标签视频

今天遇到了个神奇的问题&#xff0c;视频文件在pc端和安卓手机上播放都没问题&#xff0c;但是在ios上就是播放不了&#xff0c;大概代码如下&#xff1a; 前端代码&#xff1a; <video id"video" width"350" height"500" controls><s…

EMP-SSL: TOWARDS SELF-SUPERVISED LEARNING IN ONETRAINING EPOCH

Recently, self-supervised learning (SSL) has achieved tremendous success in learning image representation. Despite the empirical success, most self-supervised learning methods are rather “inefficient” learners, typically taking hundreds of training epoch…

TCP状态转换图

TCP状态转换图 了解TCP状态转换图可以帮助开发人员查找问题. 说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究. 对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分) 而对于关闭(图的下半部分), 服务端…

政策加持智能家居市场,涂鸦赋能客户打造“以人为本”智能生活新方式

7月18日&#xff0c;商务部等13部门联合发布了《关于促进家居消费若干措施的通知》&#xff08;以下简称《通知》&#xff09;&#xff0c;《通知》指出&#xff0c;创新培育智能消费&#xff0c;支持企业运用物联网、云计算、人工智能等技术&#xff0c;着重加快智能家电、智能…