基本概念
原始模型属于对象的创建模式。通过给出一个原型对象来指明所要创建的对象的类型,然后调用赋值这个原型对象的办法来创建出更多同类型的对象。
Java语言构建模型直接支持原始模型。
变量、对象以及对象的引用
Panda myPanda = new Panda();
这句话代表了一下几个意思:
A.创建了一个Panda类型变量,名字叫myPanda;
B.建立了一个Panda类的对象;
C.使变量myPanda指到这个对象。
如果存在一下赋值:
thatPanda = myPanda;这只是引用的赋值,两个引用同时指向一个唯一的Panda对象。
对象的复制
Clone方法:
当object类的clone方法被调用来复制一个对象时,此对象对其它对象的引用也同时被复制一份。Java语言提供的Cloneable接口只起一个作用,就是在运行期通知Java虚拟机这个可以安全的在这个类上使用clone方法。由于Object类本身没有实现Cloneable接口,所以如果所考虑的类没有实现Cloneable接口时,调用clone方法会跑出CloneNotSupportedException异常。
克隆满足的条件:
A.对任何对象x,有x.clone() ! = x。克隆对象与原对象不是一个对象。
B.对任何对象x,有x.clone() .getClass = = x.getClass。克隆对象与原始对象的类型相同。
C.如果对象x的equal方法定义得当的话,x.clone().equal(x)应当成立。
equal()方法讨论:
当两个变量指向同一个对象时,equal()方法返回true.。被克隆对象按照其内部状态是否可变分为可变对象和不可变对象,不可变对象和可变对象提供的equal()方法的工作方式应当是不同的。
可变对象只有他们是同一个对象时,equal()方法才返回true,所以这样的对象可以直接从Object类继承。不变对象必须含有相同的状态才可能满足这个条件,所以不变类型必须自己实现这个equal()方法。String类的对象属于不变对象。
原始模型的表现形式
原始模型有两种表现形式:简单形式和登记形式。
简单形式的原始模型的三种角色:
客户端角色:客户端提出创建对象的请求。
抽象原型(Prototype)角色:此角色给出所有的具体类型所需的接口。
具体原型(Concrete Prototype):被复制的对象,此角色需要实现抽象的原型角色所要求的接口。
简单原始模型的类图如下:
登记形式的原始模型模式的四种角色:
客户端角色:客户端向管理员提出创建对象请求。
抽象原型角色:与简单形式模型一样。
具体原型角色:与简单形式模型一样。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每个被记录的对象。
登记式原始模型的类图如下:
两种模式的比较:
A.如果需要创建的原型对象数目比较少而且比较固定的话,可以用简单原始模型。由客户端自己保存原型对象的引用。
B.如果创建原型对象的数目不固定的话,采用登记式的原型对象,客户端不用保存对原型对象的引用,交给管理员来做。在复制一个对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象,如果有可以直接获取对象的引用,如果没有则自己创建。
在什么情况下使用原始模型
如果一个系统的产品类是动态加载的,且具有一定的等级结构,这个时候可以采用工厂模式。但是产品类的等级结构一旦发生变化,工厂类的等级结构就必须有一个相应的变化。这时采用原始模型,给每个产品配备一个clone()方法,便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。
一个使用原始模式的系统与它的产品对象是怎么创建出来的,以及这是产品对象之间的结构是怎么样的,以及这个结构会不会发生变化是没有关系的。
原始模型的优缺点
(1)原始模型允许动态加载或减少产品类。
(2)原始模式提供简化的创建模式。
(3)具有给一个应用软件动态加载新功能的能力。
(4)产品类不需要有事先确定的等级结构,因为原始模型适用于任何的等级结构。
原始模型的主要缺点就是,每个类都必须有一个克隆方法。
参考文献:《Java与模式》,阎宏,第二十章,原始模型模式。
分享到:
相关推荐
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文
亚太经社会:2024年亚太贸易便利化报告.pdf
消费者价格指数(CPI):按消费者价格指数衡量的通货膨胀反映出普通消费者在指定时间间隔(如年度)内购买固定或变动的一篮子货物和服务的成本的年百分比变化。通常采用拉斯佩尔公式进行计算。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
网页制作基础学习--HTML+CSS常用代码
IEC TS 60364-8-3-2020 低压电气装置.第8-3部分:功能方面.生产用户电气装置的操作.pdf
智能制造数字化供应链全栈解决方案.pptx
yolov5训练自己的数据集
附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文
超级实用简洁的反色软件,支持部分区域反色!! 界面简洁,易于使用! 源码可以联系
2024年中国NAD+抗衰补剂行业研究报告
高德地图API+Python解决租房问题内含源码和设计文档.md
QYResearch:2023年前10大壁纸刀企业占据全球39%的市场份额.docx
此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
MVIMG_20240506_214323.jpg
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文
数据库是计算机科学中的一个核心领域,它用于存储、管理和检索数据。随着信息技术的发展,数据库技术已经渗透到我们日常生活的方方面面,从简单的网站用户信息管理到复杂的企业级数据仓库系统,无一不彰显其重要性。以下是一个关于数据库的综合资源描述,旨在为初学者和专业人士提供一个全面的视角。 ### 1. 数据库基础 数据库的基础知识包括了解数据模型、数据库管理系统(DBMS)以及SQL语言等。数据模型主要有关系型模型(如MySQL、Oracle)、非关系型模型(NoSQL,如MongoDB、Cassandra)等。关系型数据库遵循ACID特性(原子性、一致性、隔离性、持久性),适用于需要高度一致性的场景;而非关系型数据库则以灵活的schema设计和高可扩展性见长,适用于大数据处理和实时Web应用。 ### 2. 学习资源 - **在线课程**:Coursera、edX、Udacity等平台提供了多门数据库相关的课程,涵盖从入门到高级的各种主题,比如Stanford大学的《数据库系统概念》课程。 - **书籍**:《数据库系统概论》(Silberschatz, Korth, Sudarsha
《统计与数据分析基础》03数据处理