六、Prototype 原型设计模式
克隆:就是用一个物体复制若干个一摸一样的物体,同样在面向对象系统中,同样可以利用克隆技术来克隆若干个一摸一样的对象。
在平常创业一个对象是通过 new 一个对象,有事业务会非常复杂,这时可以通过对已经存在的对象复制就好了,这是编程中的“克隆”。
在原型模式中我们可以利用一个原型对象来指明我们所需要创建对象的类型,然后通过复制这个对象的方法来获得与该对象一摸一样的对象实例。

原型模式(Prototype)定义
原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
原型模式需要区分的概念:深拷贝、浅拷贝
浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝
深拷贝:当一个类的拷贝构造方法,不仅要赋值对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。

一、模式的结构
1.抽象原型类:规定了具体原型对象必须实现的接口
2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象
3.访问类:使用具体原型类中的 clone() 方法来复制新的对象

二、实现
原型模式分为深克隆、浅克隆,Java 中的Object 类提供了浅克隆的Clone() 方法,具体原型类只要实现 Cloneable 接口就可以实现对象的浅克隆。Cloneable 接口就是抽象原型。

原型管理器:
将多个原型对象存储在一个集合中供客户端使用,它是一个专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象的一个克隆,可以通过复制集合中对应的原型对象来获得。

原型模式的优缺点:
优点:(1):当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。
(2):扩展性好,由于原型模式提供了抽象原型类,在客户端针对抽象原型类进行编程,而将具体原型类写到配置文件中,增减或减少产品对原有系统都没有影响。
(3):原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式不需要这样,
圆形模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。
(4):可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
缺点:(1) :需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。
(2):在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。
原型模式的适用环境:
1:创建新对象成本较大(例如初始化时间长,占用CPU多或占太多网络资源),新对象可以通过复制已有对象来获得,如果相似对象,则可以对其成员变量稍作修改。
2:系统要保存对象的状态,而对象的状态很小。
3:需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的组合状态,通过复制原型对象得到新实例可以比使用构造函数创建一个新实例更加方便。
六、Prototype 原型设计模式的更多相关文章
- PHP设计模式(六)原型模式(Prototype For PHP)
原型设计模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型设计模式简单的来说,顾名思义, 不去创建新的对象进而保留原型的一种设计模式. 缺点:原型设计模式是的最主要的缺点就 ...
- 设计模式之(六)原型模式(ProtoType)
认识原型模式 原型模式是比较简单的设计模式.废话不多说,直接看定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.通过实例指定种类,种类就是初始化的类,然后通过拷贝创建对象.先展示一个 ...
- 设计模式(六)原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 设计模式:Prototype 原型模式 - 同学你抄过别人的作业么?-clone()方法的使用
原型模式: 通过某个类的实例来创建对象 使用原型模式的好处: 好处是什么呢?当我们需要多次重复的创建一个类的示例的时候,我们可以使用new但是,new不仅仅耗费内存而且,如果new 某个类的构造方法中 ...
- 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)
有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...
- 设计模式05: Prototype 原型模式(创建型模式)
Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...
- 原型设计模式(prototype
# 什么是原型设计模式 > 这里与软件工程中的原型开发模式有那么一点类似的地方,我们首先需要构建出一个原型,这个原型可以在现实开发中抽象出来的具体类型,但是这个类型与具体的类又不同,需要抽取公共 ...
- 一天一个设计模式——Prototype 原型模式
一.模式说明 看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数. 那为什么不直接调用new方法来创建类的实例呢,主要一个原因是如果 ...
- C++设计模式-Prototype原型模式
作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C+ ...
随机推荐
- python数组和矩阵使用总结
python数组和矩阵使用总结 1.数组和矩阵常见用法 Python使用NumPy包完成了对N-维数组的快速便捷操作.使用这个包,需要导入numpy. SciPy包以NumPy包为基础,大大的扩展了n ...
- 《算法》BEYOND 部分程序 part 2
▶ 书中第六章部分程序,加上自己补充的代码,包括快速傅里叶变换,多项式表示 ● 快速傅里叶变换,需要递归 package package01; import edu.princeton.cs.algs ...
- spring mvc 常见错误
1 返回400, —— 请求参数不正确 2 返回406, HTTP ERROR: 406 NOT_ACCEPTABLE ———— @RequestMapping(value = "/user ...
- ant 小结
ant 的配置文件是xml 格式的. 其xml根元素是 project project元素下面有 property path env target filelist patternset 其中 tar ...
- CentOS 7 救援模式启用网卡及重新获取IP地址
重新自动获取IP地址命令: dhclient 启用网卡命令 ifconfig ens33 up https://blog.csdn.net/hongmin118/article/details/782 ...
- kubernetes添加删除重启节点
1.添加节点 (master)查看目前节点 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-maste ...
- 使用STM32的USART的同步模式Synchronous调戏SPI[2] 【实现spi 9bit】
[原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/7064533.html 上回说道使用USART的来模拟SPI通讯.说说一下我什么写这个的原 ...
- 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)
函数说明: 1. from gensim.model import word2vec 构建模型 word2vec(corpus_token, size=feature_size, min_count ...
- How to make MySQL handle UTF-8 properly
To make this 'permanent', in my.cnf: [client] default-character-set=utf8 [mysqld] character-set-serv ...
- ssm框架使用jsp提交表单到controller
jsp代码: controller代码: