Java 原始模型(Prototype)模式
一、什么是原型模式:
通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象。
在Java语言中,支持原型模式,所有的对象都继承自Object对象,Object类提供一个clone()方法,它可以将JavaBean复制一份。所有要复制对象的类都要继承Cloneble接口,并实现继clone()方法才可以通过复制来获取自身更过的对象。如果一个对象没有实现Cloneble接口,则会抛出CloneNotSupportedException异常。
二、原型模型结构示意图:

实现clone()方法;继承Colneable接口。
三、克隆模型的特点:
1.克隆对象与原对象不是一个对象。
2.克隆对象与原对象的类型是一个类型。
3.如果equal方法重载继承重写,x.clone().equal(x)结果为true。
/**
* 一个商品类
*
* @author ZhouDX
* @since 2019/3/14 22:16:15
*/
public class Product implements Cloneable {
/**
* 构造函数
*/
public Product(String prouductId, String prouductName, String price) {
this.prouductId = prouductId;
this.prouductName = prouductName;
this.price = price;
} /**
* 构造函数
*/
public Product(String prouductId, String prouductName) {
this.prouductId = prouductId;
this.prouductName = prouductName;
this.price = "0";
} /**
* 商品id
*/
private String prouductId;
/**
* 商品id
*/
private String prouductName;
/**
* 价格
*/
private String price; public String getProuductId() {
return prouductId;
} public void setProuductId(String prouductId) {
this.prouductId = prouductId;
} public String getProuductName() {
return prouductName;
} public void setProuductName(String prouductName) {
this.prouductName = prouductName;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
} @Override
protected Object clone() {
Product productClone = new Product(prouductId, prouductName);
productClone.setPrice(price); return productClone;
} @Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Product)) {
return false;
}
Product product = (Product) o;
return Objects.equals(getProuductId(), product.getProuductId()) && Objects.equals(getProuductName(), product.getProuductName()) && Objects.equals(getPrice(), product.getPrice());
} @Override
public String toString() {
return "Product{" + "prouductId='" + prouductId + '\'' + ", prouductName='" + prouductName + '\'' + ", price='" + price + '\'' + '}';
} public static void main(String[] args) {
Product product = new Product("201903142226", "钢铁侠", "500"); Product productClone = (Product) product.clone(); System.out.println("productClone:\n" + productClone);
System.out.println("product==productClone?:" + product.equals(productClone));
System.out.println("product.getClass()==productClone.getClass()?:" + product.getClass().equals(productClone.getClass()));
System.out.println("product.clone().equals(product)?"+product.clone().equals(product));
}
}
运行结果:

三、原始模型的分类:
简单原始模型:

Prototype(抽象原始模型角色):抽象类或者一个接口,给出具体模型需要的接口。
ConcretePrototype(具体原始模型角色):继承抽象原型模型角色,被复制的对象。
Client(客户端):提出复制请求。
/**
* 抽象原始模型角色
*
* @author ZhouDX
* @since 2019/3/14 22:12:10
*/
public interface Prototype extends Cloneable { Prototype clone();
}
Java 原始模型(Prototype)模式的更多相关文章
- Java设计模式(4)原型模式(Prototype模式)
Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...
- Java 实现原型(Prototype)模式
public class BaseSpoon implements Cloneable {//spoon 匙, 调羹 String name; public String getName() { re ...
- 设计模式之Prototype模式
通常我们会使用new 类名()的方法会去生成一个新的实例,但在开发过程中,有时候也会有"在不指定类名的前提下生成实例"的需求,那样,就只能根据现有实例来生成新的实例. 有三种情况, ...
- 23种设计模式——Prototype模式
Prototype模式是提供自我复制的功能.包括浅拷贝和深拷贝. 一.Prototype模式的用途 场景1:游戏场景中有很多类似的敌人,它们的技能都一样,但是随着敌人出现的位置和不同,它们的能力也不太 ...
- 设计模式(六)Prototype模式
Prototype模式就是不根据类来生成实例,而是根据实例来生成新实例.至于为什么不能根据类来生成实例,在最后会讲到. 还是根据实例程序来理解这种设计模式吧. 下面是实例代码. package Big ...
- Java设计模式原型模式
原型模式: – 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式. – 就是java中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具备原型对象的特点 – 优势 ...
- 【设计模式】Java设计模式 - 原型模式
[设计模式]Java设计模式 - 原型模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- java装饰者模式理解
java 装饰者模式其实就是扩展子类的功能,和继承是一个性质. 但继承是在编译时就固定扩展了父类的一些功能,而装饰者模式是在运行过程中动态绑定对象,实现一个子类可以随时扩展功能. 将方法排列组合,也可 ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
随机推荐
- Python-字符版gif图
一.背景 上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾Python-炫酷二维码,本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并 ...
- Java秋招面经大合集
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- vue全家桶安装以及修改webpack配置新增vue项目启动方式
一.安装node环境(自带npm) 下载地址 二.替换下载源 // 淘宝 NPM 镜像 npm install -g cnpm --registry=https://registry.npm.taob ...
- Go map实现原理
map结构 整体为一个数组,数组每个元素可以理解成一个槽,槽是一个链表结构,槽的每个节点可存8个元素,搞清楚了map的结构,想想对应的增删改查操作也不是那么难
- oracle如何查看当前有哪些用户连接到数据库
可以执行以下语句:select username,serial#, sid from v$session; ---查询用户会话alter system kill session 'serial#, s ...
- qt+vs2017环境下XIMEA相机库的配置
从第一篇博客出来之后就没再更新过博客,这一次再更新博客的时候已经是换了项目了,现在在搞双目视觉方面.刚开始接触这一方面,前几天一直在研究相机原本的库函数的调用问题 网上这一方面的很少,而且很多都是在u ...
- Maven项目pom文件设置JDK版本
maven项目创建之后有时候默认设定了java的低版本,每次导入项目或者更新maven的时候可能或出现一些报错,在pom.xml设定版本免除这个问题 <build> <finalNa ...
- ASP.NET Aries 高级开发教程:Excel导入配置之规则说明(下)
前言: 前面两篇都是大体介绍流程,有一些配置细节,没有细说,这里用一篇补上. 1.Excel配置项 起始行索引.列头跨行数: 对于自定义的Excel导入模板(有时候模板是由客户提供,模板的规则很乱) ...
- 【RL-TCPnet网络教程】第40章 RL-TCPnet之TFTP客户端(精简版)
第40章 RL-TCPnet之TFTP客户端 本章节为大家讲解RL-TCPnet的TFTP客户端应用,学习本章节前,务必要优先学习第38章的TFTP基础知识.有了这些基础知识之后,再搞本章节 ...
- Java8与传统的日期和时间类详解
一.传统的日期时间类(Date和Calendar) 1. Date类 这里的Date是位于java.util包下的类,而不是java.sql包下的date类,Date对象即包含日期也包含时间,从JDK ...