《Java与模式》选读“原始模型(Prototype)模式”

DBeaver连接IoTDB避坑指南:手动配置JDBC驱动的完整流程(附问题排查) 本文提供了在DBeaver中手动配置Apache IoTDB JDBC驱动的完整流程与避坑指南。详细解析了从驱动创建、库文件添加(关键是指向整个lib目录)到连接测试的每一步,并重点针对常见的ClassNotFoundException、连接拒绝等错误提供了深度排查方案,帮助用户高效建立图形化管理连接。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 这本书详细讲解了模式理论的由来(很多人可能不知道模式理论与中国道家思想的渊源),面向对象的软件设计原则,一直讲到二十几个设计模式,以及这些模式在Java语言中的实现等等。书中给出了大量来自华尔街系统的真实项目的例子,用来讲解设计模式在系统设计中的应用。 这本书处于理论和实践之间,是一本定位独特、风格独特的书。希望各位喜欢。 阎宏 javapatterns@yahoo.com www.WebEndsHere.com 原始模型模式属于对象的创建模式[GOF95]。通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原始模型模式的用意。 从孙大圣的手段谈起 --------------------- 孙悟空在与黄风怪的战斗中,“使一个身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一喷,叫声‘变!’变有百十个行者,都是一样打扮,各执一根铁棒,把那怪围在空中。” 换言之,孙悟空可以根据自己的形像,复制出很多“身外之身”来。 老孙的这种身外身的手段在面向对象的设计领域里,叫做原始模型(Prototype)模式。 Java语言的构件模型直接支持原始模型模式。所有的JavaBean都继承自java.lang.Object,而Object类提供一个clone()方法,可以将一个JavaBean对象复制一份;但是这个JavaBean必须实现一个标示接口Cloneable表明这个JavaBean支持复制。如果一个对象没有实现这个接口而调用clone()方法,Java编译器会抛出CloneNotSupportedException异常。(关于标示接口的概念及相关讨论,请见本书的“专题:Java接口”一章。) Java的所有类都是从java.lang.Object类继承而来;而Object类提供下面的方法对对象进行复制: protected Object clone() 子类当然也可以把这个方法置换掉,提供满足自己需要的复制方法。对象的复制有一个基本问题,就是对象通常都有对其它的对象的引用;当使用Object类的clone()方法来复制一个对象时,此对象对其它对象的引用也同时会被复制一份。 Java语言提供的Cloneable接口只起一个作用,就是在运行时期通知Java虚拟机可以安全地在这个类上使用clone()方法。通过调用这个clone()方法可以得到一个对象的复制。由于Object类本身并不实现Cloneable接口,因此如果所考虑的类没有实现Cloneable接口时,调用clone()方法会抛出CloneNotSupportedException异常。 系统可以在自己的类里面置换掉java.lang.Object提供的clone()方法,以便控制复制的过程。 克隆满足的条件 ------------- clone()方法将对象复制了一份并返还给调用者。所谓“复制”的含义与clone()方法是怎么实现的有关。一般而言,clone()方法满足以下的描述[BLOCH01]: 第一、对任何的对象x,都有:x.clone() != x;换言之,克隆对象与原对象不是同一个对象; 第二、对任何的对象x,都有:x.clone().getClass == x.getClass(),换言之,克隆对象与原对象的类型一样; 第三、如果对象x的equals()方法是定义恰当的话,那么 x.clone().equals(x)也应当是成立的。 在Java语言的API中,凡是提供了clone()方法的类,都满足上面的这些这些条件。Java语言的设计师在设计自己的clone()方法是,也应当遵守这三个条件。 一般来说,上面的三个条件中的头两个是必需的,而第三个是可选的;本书则推荐读者遵守所有的三个条件。 equals()方法的讨论 ------------------ 上面所给出的三个条件中,第三个条件常常被忽视。很多读者误以为可以通过继承得到java.lang.Object对象的equals()方法就足够了;而这是不对的。为了帮助读者了解equals()方法,首先看一看java.lang.Object的源代码: public boolean equals(Object obj) { return (this == obj); } 代码清单4、java.lang.Object源代码片断。 也就是说,当两个变量指向同一个对象时,equals()方法才会返还true。很显然,这并不适合于所有需要被克隆的对象。 假设被克隆的对象按照它们的内部状态是否可变划分成可变对象和不变对象的话,那么可变对象和不变对象所提供的equals()方法的工作方式应当是不同的。 可变对象只有当它们是同一个对象时equals()才会返还true,所以这样的类型可以直接从java.lang.Object继承这个方法;不变对象必须含有相同的状态才可能满足这个条件,因此不变类型必须自行实现这个equals()方法。 一个典型的例子就是Java的String。读过本书的“不变(Immutable)模式”一章的读者都应该知道,Java的String对象都是不变对象;而不变对象具有不会改变的内部状态;具有相同内部状态的String对象对于客户端就没有区别。这样一来,两个String对象的比较就应当是它们的内部状态值的比较。 本章在后面不会接触到不变对象的克隆,因此不会提供特殊的equals()方法。关于不变对象和不变模式的讨论,请读者参阅本书的“不变(Immutable)模式”一章。 原始模型模式有两种形式:第一种实现是简单形式,第二种是登记形式。这两种表现形式仅仅是原始模型模式的不同实现,但是由于它们的区别影响了模式结构的细节,因此本书把它们提前到这里讲解。 在什么情况下使用原始模型模式 假设一个系统的产品类是动态加载的,而且产品类具有一定的等级结构。 这个时候如果采取工厂模式的话,工厂类就不得不具有一个相应的等级结构;而产品类的等级结构一旦变化,工厂类的等级结构就不得不有一个相应的变化。这对于产品结构可能会有经常性变化的系统来说,采用工厂模式就有不方便之处。 在这种时候如果采取原始模型模式,给每一个产品类配备一个克隆方法(大多数的时候只需给产品类等级结构的根类配备一个克隆方法),便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。 这样,一个使用了原始模型模式的系统与它的产品对象是怎么创建出来,以及这些产品对象之间的结构是怎样的,以及这个结构会不会发生变化是没有关系的。 模式的优点和缺点 抽象工厂模式有许多与原始模型模式和建造模式相同的效果,包括客户端不知道具体产品类,而只知道抽象产品类,客户端不需要知道这么多的具体产品名称。如果有新的产品类加入,客户端不需要进行改造就可直接使用。 原始模型模式又有其特有的优点: 第一、原始模型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此增加新产品对整个结构没有影响。 第二、原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而原始模型模式就不需要这样。对于Java设计师来说,原始模型模式又有其特有的方便之处,因为Java语言天生就将原始模型模式设计到了语言模型里面。 善于利用原始模型模式和Java语言的特点,可以事半而功倍。 第三、给一个应用软件动态加载新功能的能力。例如,一个分析Web服务器的记录文件的应用软件,针对每一种记录文件格式,都可以有一个相应的“格式类”负责。如果出现了应用软件所不支持的新的Web服务器,只需要提供一个格式类的克隆,并在客户端等登记即可;而不必给每个软件的用户提供一个全新的软件包。 第四、产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适用于任何的等级结构。 原始模型模式的最主要缺点,是每一个类都必须配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说不是很难;而对于已经有的类不一定很容易。特别是当一个类引用到不支持串行化的间接对象,或者引用含有循环结构的时候。 ========================== 回答某网友问:为什么不使用new关键词,而使用原始模型模式? 如果您有一个对象,有着复杂的状态。您希望得到另一个拷贝,但是同时具有一模一样的状态,如果选择从头创建一个新的对象,您将不得不重新一个一个地设置这些状态。有的时候着很麻烦,有的时候这不可能做到。这种时候,使用原始模型模式,调用一个克隆方法,就变成非常好的办法。 仍然使用孙大圣为例,如果我们从头创建一个一个的大圣对象,那么我们将不得不从石头猴子开始点化,配备上一模一样的虎皮裙,再找龙王要来一模一样的金箍棒。。。这种工作量难以想象。 孙大圣的身外身法术出神入化地解决了这个问题:大圣可以直接将本尊克隆出来,所有的化身都自动具有相同的虎皮裙,一模一样的金箍棒,一模一样的精神抖擞。这就是原始模型模式的威力。 希望您能喜欢这本书。 阎宏 博士 《Java与模式》的作者 JavaPatterns@yahoo.com www.WebEndsHere.com
SAP ERP销售应收&成本科目确定 ERP作为业财一体软件,其中最核心的就是业务与财务模块的自动集成,无需财务进行手工做账,提高工作效率的同时降低人工操作产生的误差。今天浅浅的分享一下SD模块生成会计凭证时,借贷项确定的系统配置。一般项目上借贷项、科目都有FICO提供,但是具体的集成配置是在SD这边。 阅读详情

相关推荐

PCB布局规范及其注意事项(纯干货)

这样做的好处是信号1,3层不会有串扰,4和5作为电源有紧密的耦合,3个信号层都有GND平面可以参考,且不会互相产生串扰,唯一的缺点是布线的层面只有3个信号层(信号03的是最适合来传输高速信号,因为该层的二面都有屏蔽,防止干扰传出,也防止干扰传入)33、影响阻抗匹配的参数(ER介电常数(1GHZ以下默认为4.2,以上的话问板厂),H介质厚度(就是内层压合的PP片厚度),W走线的线宽,T走线的厚度(铜厚/减小线的厚度可以增大阻抗))我这里使用的是CITS25来计算阻抗。

qq_42379138的博客 8849

JavaScript原型Prototype详情

文章来源: 学习通http://www.bdgxy.com/ 目录1、概述1.1原型是什么1.2获取原型2、原型属性2.1利用原型添加属性与方法。2.2访问原型属性原型方法3、自有属性与原型属性3.1检测自有属性或者原型属性4、isPrototypeOf()方法5、扩展内置对象6、结语1、概述 1.1原型是什么 在JavaScript中,函数是一个包含属性和方法的Function类型的对象。而原型(Prototype )就是Function类型对象的一个属性。 在函数定义是包含了prototype属

菜鸟教程 2979

【MATLAB/Simulink】从模型到飞行:基于PX4与Rflysim的无人机MBD实战指南

本文详细介绍了基于MATLAB/Simulink与PX4、Rflysim的无人机模型开发与飞行控制实战指南。通过MBD(基于模型设计)方法,从建模、仿真到代码生成与硬件部署,实现无人机开发的高效闭环。文章涵盖开发环境搭建、动力学建模、控制算法实现及测试验证全流程,为无人机开发者提供实用技巧与优化建议。

weixin_30181209的博客 410

Java Script中的__proto__和prototype属性举例与说明

Java Script中的__proto__和prototype举例与说明

qq_40271185的博客 392

用WorkBuddy搭建漫剧AI自动化制作流水线全攻略

在内容创作领域,AI智能体正逐渐从单一工具辅助走向全流程自动化调度。其核心原理是将剧本、分镜、绘图、配音、剪辑等环节拆解为可独立执行的任务单元,由总控系统统一协调,从而大幅降低人力与时间成本。这种模式尤其适用于动态漫画(漫剧)这类环节多、专业度要求高的视频形态。传统制作流程中,角色一致性、配音周期和剪辑返工是公认的效率瓶颈,而借助AI智能体工作台,创作者只需输入故事创意,即可驱动多个数字分身协同完成内容生产。本文以WorkBuddy为例,详细展示如何配置模型、安装技能包并串联五段式流水线,将单集制作成本从万

weixin_28224217的博客 254

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

wgl307293845的博客 2081

Java Javascript 语言:(十二)自定义对象prototype

自定义对象prototype <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script> function user(age, sex) { this.name = "张三"; this.age = age; this.sex = sex; this.eat = function

地球村 364

WinCC实现定时存储数据至SQLServer

环境 Win10 WinCC V7.5 SQL Server 2016 运行结果 流程 WinCC变量 全局VB脚本 (我设置的是每2秒存一次,因此周期性触发器设置1秒)

skr? 3990

Java script 原型_你不知道的JavasScript上篇·第五章·原型·上

1、[[Prototype]]JS中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时这个属性都被赋予一个非空的值 (proto)var myObject = {a:2}myObject.a;//2查找a的过程:第一步默认[[Get]]操作检查myObject本身有没有这个属性,有的话就直接用自身的,没有就要继续访问对象的[[Prototye]...

weixin_34238178的博客 141

GeoServer改造Springboot源码一(公共部分)

今天开始开启关于GeoServer的一个全新系列,主要是把改造Springboot后的详细代码粘贴出来,此文应配合《》系列共同阅读,按照前系列的时间顺序结合此系列的源码展示可以快速构建GeoServer功能的二次封装的后端系统。

龙井的专栏 1903

基于Python的SEC Edgar文件高效爬取:最新技术与实战指南

本文详细介绍了如何使用Python最新技术高效爬取SEC Edgar数据库中的金融文件。我们将探讨SEC Edgar系统的结构、合法爬取注意事项,并使用现代Python库如Requests-HTML、aiohttp和Playwright实现多种爬取方案。文章包含完整的代码示例、性能优化技巧以及数据处理方法,为金融数据分析师、研究人员和开发者提供全面指导。关键词:SEC Edgar、Python爬虫、金融数据、异步爬取、Playwright、XBRL解析。

2201_76125261的博客 634

Javascript: 从prototype漫谈到继承(1)

本文同时发布在另一独立博客Javascript: 从prototype漫谈到继承(1) javasscript的prototype原型链一直是一个难点,这篇文章是对自己这段时期学习的一个总结,在这里不谈ECMAScript标准,也不会用UML图画出各种关系(结合这两方面谈的文章非常的多,但大部分都相当晦涩,比如汤姆大叔),只力求最浅显易懂,深入浅出,供以后自己和各位参考。 javascrip...

weixin_30847939的博客 128

基于STM32L4XX、HAL库的AD7768BSTZ 模数转换器ADC驱动程序设计

/ 默认SPI配置。// 读取通道数据命令。// 通过SYNC_IN引脚触发转换(如果使用)// 处理数据...// 或者通过SPI命令。// 初始化AD7768。// SPI1引脚配置。

zhusl6688的博客 462

剖析javscript中类、prototype及new实例之间的关系

js的对象是一个包含属性、方法的 key/value 的Object,构造对象就是向一个Object中添加属性和方法,因此我们可以样来构造对象 var obj = {} obj.title = "obj"; obj.getTitle = function(){ return this.title; } 显然这样构造对象的效率不高,难以维护,通过实例化“类”获取对象将更加优雅,js对类的支

DS的专栏 867

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深入理解javacript之prototype

对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念。这些对弄明白了,应该就可以比较自信的驾驭这种语言了。 大家都知道,javascript中的继承不是使用的类继承的机制,而是使用的另一种方式 – 原型继承。在原型继承方式中,本质上是javascript语言加入原型链这种机制...

weixin_30369041的博客 160

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java script 原型_javascript 原型链

浅谈JS原型链原型链ECMAScript中描述了原型链的概念。我们知道ECMAScript并不像C++,Java那样使用类,但是对象仍然可以通过多种方式创建,其中就有构造函数方式。每个构造函数都有一个原型对象,同时都有一个prototype属性, prototype属性指向构造函数的原型对象,它被用来实现基于原型的继承和共享。而原型对象又都默认会取得一个constructor属性,这个属性包含一个...

weixin_36213143的博客 179

Java 实现原型(Prototype)模式

[java] view plaincopyprint? public class BaseSpoon implements Cloneable {//spoon 匙, 调羹        String name;          public String getName() {           return name;       }     

2519

浅谈Java设计模式(五)原型模式(Prototype)

前言: 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。在Java中,复制对象是通过clone()实现的,先创建一个原型类: public class Prototype implements Cloneable { public Obj

比较喜欢、笑的博客专栏 1万+

JS中的prototype

JS中的phototype是JS中比较难理解的一个部分   本文基于下面几个知识点:   1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。   2 javascript的方法可以分为三类: a 类方法 b 对象方法 c 原型方法 例子: ...

weixin_34390105的博客 354

JavaScript中prototype用法

1 概述 大部分面向对象的编程语言,都是以类class作为对象的基础语法,js语言不是如此,它的面向对象编程基于‘原型对象’。 首先说说构造函数的缺点: js通过构造函数生成新的对象,因此构造函数可以视为独享的模版。实例对象的属性和方法,可以定义在构造函数内部 概述 构造函数的缺点 JavaScript通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定

jasonzds的博客 8662

java script 原型

http://evilmann1.iteye.com/blog/833879 创建指定类的实例             varPeople = {             Create: function(name, age) {                 this.name = name;                 this.age = age;

quasiceo 488

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 301

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 516

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 327

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 351

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 548

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 420
上一篇: java网络蚂蚁的制作流程
下一篇: JAVA开源项目剖析平台--帮助
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值