在说原型模式之前,我们先来看java里面的深复制和浅复制:

1. 浅复制:被复制的对象的所有变量都持有和原来对象的变量相同的值,而所有的对其他对象的引用都指向原来的对象。

2. 深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他变量的对象。那些引用其他对象的变量将指向被复制过来的新对象,而不是原来那些被引用的对象。深复制需要把要复制的对象的所有引用都复制一遍。

这两者的区别就是关于引用对象的处理,浅复制是不考虑引用对象,而深复制需要考虑引用对象的问题。

对java中的clone()方法我们有以下约定:

1. 对于任何的对象x, 都有x.clone()!=x

2. 对于任何的对象x, 都有x.clone().getClass() == x.getClass();

3. 对于任何的对象x, 都有x.clone().equals(x) = true

继承自java.lang.Object的clone方法是浅复制。

在深复制的过程中我们需要考虑深复制的深度问题,可能会出现循环引用的问题,所以对于深复制,我们一般是利用串行化来做深复制的:先把对象写到流里,再从流里读出来。

下面是一段示意性的代码:

package com.javadesignpattern.prototype;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class TestDeepClone implements Serializable{/*** */private static final long serialVersionUID = 1L;public static void main(String[] args) throws IOException, ClassNotFoundException{File file = new File("out.ser");FileOutputStream fos = new FileOutputStream(file);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject("test");oos.flush();FileInputStream fis = new FileInputStream(file);ObjectInputStream ois = new ObjectInputStream(fis);System.out.println(ois.readObject());ois.close();}}

下面看原型模式的结构,《java与模式》中给出两种原型模式,一种是简单形式的原型模式,一种是登记型的原型模式。

1. 简单形式的原型模式

示意性代码:

package com.javadesignpattern.prototype.simple;public interface Prototype extends Cloneable {public Object clone();}

  

package com.javadesignpattern.prototype.simple;public class ConcretePrototype implements Prototype {public Object clone(){try {return super.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch block
            e.printStackTrace();return null;}        }}

package com.javadesignpattern.prototype.simple;public class Client {private Prototype prototype;public void operation(Prototype example){Prototype prototype = (Prototype)example.clone();}public static void main(String[] args){Prototype prototypeTest = new ConcretePrototype();Client clientInctance = new Client();clientInctance.operation(prototypeTest);System.out.println(clientInctance.prototype);}}

2. 登记形式的原型模式

示意性代码如下:

1. Prototype和CPrototype类和上面的简单原型模式没什么区别。

package com.javadesignpattern.prototype.register;import java.util.ArrayList;public class PrototypeManager {private ArrayList object = new ArrayList();public Prototype get(int i) {return (Prototype)object.get(i);}public void set(Prototype objectp) {object.add(objectp);}public int getSize(){return object.size();}}

package com.javadesignpattern.prototype.register;public class Client {private PrototypeManager mgr;private Prototype prototype;public String registerPrototype(){prototype = new ConcretePrototype();mgr = new PrototypeManager();mgr.set((Prototype)prototype.clone());    if(mgr != null ){return "SUCCESS";}else{return "FAILED";}}public static void main(String[] args){Client client = new Client();System.out.println(client.registerPrototype() + "-------" + client.mgr.getSize());}}

简单原型模式和登记类型的原型模式的比较:

1. 如果需要创建的原型对象的数目比较少并且比较固定的话,我们可以选择第一种简单类型的原型,这种情况下,原型对象由客户端持有。

2. 如果需要创建的原型对象不固定的话,可以选择第二种方式:登记类型的原型,这样的话原型对象交给manager类持有,客户端从原型类中解脱出来,在创建一个新的原型对象之前,客户端可以看Manager类中是不是已经有符合条件的对象,有的话,就直接从manager类中拿出来用,没有的话,客户端就自己再去复制一份。

转载于:https://www.cnblogs.com/ChristyorRuth/p/3763273.html

设计模式(六) : 创建型模式--原型模式相关推荐

  1. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  2. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  3. Java设计模式之行为型:解释器模式

    一.什么是解释器模式:         解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例. 这里我们将语言理解成使用规定格式和语 ...

  4. Java设计模式之行为型:访问者模式

    背景: 去医院看病时,医生会给你一个处方单要你去拿药,拿药我们可以分为两步走: (1)去柜台交钱,划价人员会根据处方单上的药进行划价,交钱. (2)去药房拿药,药房工作者同样根据处方单给你相对应的药. ...

  5. Java设计模式之行为型:状态模式

    背景: 介绍状态模式前,我们先看这样一个实例:公司力排万难终于获得某个酒店的系统开发项目,并且最终落到了你的头上.下图是他们系统的主要工作: 当第一眼看到这个系统时你就看出这是一个状态图,每个框都代表 ...

  6. Java设计模式之行为型:备忘录模式

    在开发过程中,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,在编程时假如编写失误,例如不小心误删除了几行代码,我们希望返回删除前的状态,便可以使用 Ctrl+Z 来进行返回,这时 ...

  7. Java设计模式之行为型:命令模式

    前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...

  8. Java设计模式之行为型:迭代器模式

    一.什么是迭代器模式: 实际开发中,我们针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但我们不希望在集合容器的抽象接口层中充斥着各种不同的遍历操作,这时候我们就需要一种能完成下面功能的迭代器 ...

  9. Java设计模式之行为型:模板方法模式

    一.什么是模板方法模式: 模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架).在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟 ...

  10. Java设计模式之行为型:策略模式

    一.背景: 在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找.排序等,一种常用方式是硬编码在一个类中,如需要提供多种查找算法, ...

最新文章

  1. mysql if exist坑
  2. mysql 5.6 双向互备_mysql双主互备
  3. Linux网络配置与命令
  4. cmd该清华镜像_Docker动手教程3.3:容器镜像构建2
  5. 资本冬天已至,开发者却可以着眼未来
  6. Deep Learning 【Nature review】
  7. 庆祝西安.NET俱乐部成立,请申请加入的朋友在这里报到
  8. 基于win32的windows画板程序
  9. 软件设计师的成长之路
  10. cdn厂商 同兴万点_CDN牌照哪家强?阿里、腾讯牌照差异竟如此之大
  11. 马士兵Python基础版2020教程P98-P134 PPT笔记+课堂代码
  12. java 二叉树详解 + 实现代码
  13. python开根_python如何开根号
  14. 赏析角度有哪些_从哪些角度赏析句子
  15. OpenFOAM编程基础(2) -数据读取与保存
  16. DataGear 轻松制作支持图表联动的全国地图、省级地图数据可视化看板
  17. python地图匹配_坐标点地图匹配方法
  18. 1080p笔记本哪个linux,System76经典Linux笔记本Lemur Pro回归 采用14.1英寸1080p显示屏
  19. Boolean Satisfiability Problem(SAT)问题介绍
  20. 数据库的范式化和反范式化模型

热门文章

  1. python列表去重函数_对python中两种列表元素去重函数性能的比较方法
  2. 汇编学习--7.13--标志寄存器
  3. python伪装浏览器https_Python3 伪装浏览器的方法示例
  4. NAT-PT (Network Address Translation-Protocol)网络地址转换协议转换
  5. 使命召唤为啥显示新服务器玩家,《使命召唤8》建立服务器和加入自己、别人服务器方法...
  6. python3 读写json文件,python3没有读取JSON文件righ
  7. odbc mysql server_使用MySQL ODBC进行MySQL和SQL Server转换
  8. FastHook——实现.dynsym段和.symtab段符号查询
  9. 在android 两个类之间 get,set方法传参使用
  10. java实现倒计时源码分享