java-設計模式-原型模式
原型模式
是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。
問題:
如果我們要複製一個類實例:
首先, 你必须新建一个属于相同类的对象。 然后, 你必须遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。
但是:并非所有对象都能通过这种方式进行复制, 因为有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。
而且我們複製的時候需要知道勢力的具體類,如果這個類實現的是接口,那就男判定
解決:
原型模式将克隆过程委派给被克隆的实际对象。 模式为所有支持克隆的对象声明了一个通用接口,
该接口让你能够克隆对象, 同时又无需将代码和对象所属类耦合。
通常情况下, 这样的接口中仅包含一个 克隆方法。
實現方法:
原型 (Prototype) 接口将对克隆方法进行声明。 在绝大多数情况下, 其中只会有一个名为
clone克隆的方法。具体原型 (Concrete Prototype) 类将实现克隆方法。 除了将原始对象的数据复制到克隆体中之外, 该方法有时还需处理克隆过程中的极端情况, 例如克隆关联对象和梳理递归依赖等等。
客户端 (Client) 可以复制实现了原型接口的任何对象。
應用場景
1如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。
簡單例子
/**
* 原型模式:需要继承Cloneable接口,
* Cloneable接口是抽象的原型类。犹如我们类里面的object
*
* 优点: 基于内存二进制流的复制,更加高效,性能比new方法的好
* 缺点:每个类都需要一个clone方法。
* clone方法位于内部,对已经存在的类修改,需要修改类的代码
* 可能存在深克隆,多个类嵌套的时候,克隆复杂,每一层的对象都必须支持深克隆。
*
* 应用场景:
* 存在相同对象或相似对象的创建问题。如果都是用构造函数进行对象创建。消耗资源,原型模式更加高效
*
*
* 应用结构:
* 抽象原型:需要实现接口
* 具体原型类:实现接口的即抽象原型类的clone(),是可被复制的对象
* 访问类:具体原型中的clone()方法来复制新的对象
*/
public class PrototyeClass implements Cloneable {
PrototyeClass(){
System.out.println("具体原型创建成功");
} @Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("原型复制成功");
return (PrototyeClass)super.clone();
}
}
測試:
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
PrototyeClass prototyeClass = new PrototyeClass();
PrototyeClass prototyeClass1 = (PrototyeClass) prototyeClass.clone();
PrototyeClass prototyeClass2 = (PrototyeClass) prototyeClass.clone();
//看输出的地址,判断是不是同一个实例来的
System.out.println(prototyeClass+" "+prototyeClass1+" "+prototyeClass2);
/**
* 具体原型创建成功
* 原型复制成功
* 原型复制成功
* Prototype.PrototyeClass@61bbe9ba Prototype.PrototyeClass@610455d6 Prototype.PrototyeClass@511d50c0
*/
}
}
java-設計模式-原型模式的更多相关文章
- Java设计模式5:原型模式
原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...
- 《JAVA设计模式》之原型模式(Prototype)
在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...
- java设计模式--创建模式--原型模式
原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...
- 创建模式--原型模式(JAVA)
原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...
- java设计模式-----5、原型模式
原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例.使用原型模式创建的实例,具有与原型一样的数据. 原型模式的特点: 1.由原型对象自身创建目标对象.也就是说 ...
- 【java设计模式】-06原型模式
原型模式简述 定义: 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ,也就是通过复制现有对象实例产生新的对象,也就是所谓的"克隆" 实现方式: 1.实现Cl ...
- java学习笔记之原型模式及深浅拷贝
一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...
- 重学 Java 设计模式:实战原型模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老板你加钱我的代码能飞 程序员这份工作里有两种人:一类是热爱喜欢的.一类是仅当成工作 ...
- 深度分析:java设计模式中的原型模式,看完就没有说不懂的
前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...
随机推荐
- k8s中prometheus监控k8s外mysql
k8s外安装mysql https://www.cnblogs.com/uncleyong/p/10739530.html 配置MySQL Exporter采集MySQL监控数据 创建yaml文件:v ...
- Linux安装Python xlrd、xlwt、xlutils模块
一.安装setuptools: 可以先打开setuptools的python官网看看setuptools软件包如何安装: 1 > wget https://bitbucket.org/pypa/ ...
- 大数据分析用自助式BI工具就能轻松解决,so easy!
之前老板给了我一个任务,让我赶紧学习一下大数据分析,下个季度就要用. 赶紧看了一下日历,这离下个季度还有不到半个月的时间,而且我还没有数据分析基础,该怎么能在这么短的时间内学会大数据分析呢-- 经过多 ...
- pycharm创建模板
用pycharm构造作者模板 模板,就是创建一个文件时自动生成模板内容. 这里用pycharm创建作者模板,步骤如下: File-->Settings Editor-->File and ...
- iOS动态库和静态库的运用
概念认识 什么是库 库是共享程序代码的方式,库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.在开发过程中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把 ...
- Oracle子查询临时表
ORACLE 临时表,可以有两种类型的临时表:会话级临时表.事务级临时表. 会话级临时表: 因为这个临时表中的数据和你的当前会话有关系,当你当前 SESSION 不退出的情况下,临时表中的数据就还存在 ...
- tput用法详解-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月28日 tput 命令将通过 terminfo 数据库对终端会话进行初始化和操作. 主要功能为:移动更改光标.更改文本属性颜色.清除屏幕特定区域. ...
- tomcat启动错误:Error running 'Tomcat 9.0.34': Address localhost:1099 is already in use
解决方法博客地址:https://blog.csdn.net/weixin_46697202/article/details/105782670
- selenium+python自动化105 - selenium 如何在已打开的浏览器上继续运行自动化脚本?
前言 使用selenium 做web自动化的时候,经常会遇到这样一种需求,是否可以在已经打开的浏览器基础上继续运行自动化脚本? 这样前面的验证码登录可以手工点过去,后面页面使用脚本继续执行,这样可以解 ...
- LeetCode-043-字符串相乘
字符串相乘 题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例说明请见LeetCode官网. 来源:力扣( ...