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中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
随机推荐
- 【STM32H7教程】第9章 STM32H7重要知识点数据类型,变量和堆栈
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第9章 STM32H7重要知识点数据类型,变量和堆栈 ...
- 【工具篇】接口测试神器 -- Postman 入门教程
一.Postman概述 (1)工具介绍 Postman是一个接口测试工具,一款非常流行的API调试工具.在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求 ...
- javascript引擎执行的过程的理解--执行阶段
一.概述 同步更新sau交流学习社区(nodeJSBlog):javascript引擎执行的过程的理解--执行阶段 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍 ...
- [小技巧]ASP.NET Core中如何预压缩静态文件
原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...
- 『性能』ServiceStack.Redis 和 StackExchange.Redis 性能比较
背景 近来,需要用到 Redis 这类缓存技术 —— MongoDB 和 Redis 没有进行过比较. 我也懒得在这些细节上 纠结那么多 —— 按照网友给出的文章,听从网友建议,选择 Redis. R ...
- 【我们一起写框架】MVVM的WPF框架(五)—完结篇
前言 这篇文章是WPF框架系列的最后一篇,在这里我想阐述一下我对框架设计的理解. 我对框架设计的理解是这样的: 框架设计不应该局限于任何一种设计模式,我们在设计框架时,应该将设计模式揉碎,再重组:这样 ...
- 如何使用JS来开发室内地图商场停车场车位管理系统
在线体验到室内地图的功能后,手机对室内地图加载一个字,要显示“快”,目前微信和电脑都可以打开室内地图的要求是3秒内打开,能有定位导航的功能最好,这样方便找到要去的地方. 对于经常逛商场的MM来说,哪里 ...
- 基于Vue2-Calendar改进的日历组件(含中文使用说明)
一,前言 我是刚学Vue的菜鸟,在使用过程中需要用到日历控件,由于项目中原来是用jQuery写的,因此用了bootstarp的日历控件,但是配合Vue实在有点蛋疼,不够优雅…… 于是网上搜了好久找到了 ...
- Android 切换横竖屏
一个项目一般会自己先定义项目是横屏还是竖屏但是也有可以横屏和竖屏之间切换的activty. 切换横竖屏的方法: //判断当前屏幕方向if(getRequestedOrientation() == Ac ...
- Flutter 即学即用系列博客——07 RenderFlex overflowed 引发的思考
背景 在进行 Flutter UI 开发的时候,控制台报出了下面错误: flutter: ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY >╞════════ ...