定义:

使用原型实例指定创建对象的种类,并通过拷贝这个原型的属性创建新的对象。

结构图:

  • Prototype:抽象原型类,声明克隆方法的接口,并是所有原型类的公共父类。在Java中,Object类为该角色。
  • ConcretePrototype:具体原型类,实现克隆方法,返回自己的一个克隆对象。
  • Client:从一个已有的原型对象,调用其克隆方法,获得该对象的克隆对象,针对抽象原型类编程,方便进行扩展和修改。

浅克隆(Shallow Clone)

  • 浅克隆中,如果原型对象的成员变量是值类型,则进行复制,不会相互影响,如果是引用类型,则将其地址复制,实质上指向的是同一个对象。
  • 在Java语言中可以覆盖Object中的clone()方法来实现浅克隆,其中具体原型类必需要实现Cloneable接口。如果没有实现这个接口,则会抛出CloneNotSupportedException。
class ConcretePrototype implements  Cloneable
{
……
public Prototype clone()
{
  Object object = null;
  try {
     object = super.clone();
  } catch (CloneNotSupportedException exception) {
     System.err.println("Not support cloneable");
  }
  return (Prototype )object;
}
……
}

深克隆(Deep Clone)

  • 无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象。
  • 在Java中可以通过序列化(Serialization)来进行深克隆,即原型对象实现Serializable接口,然后写入到ObjectOutputStream,则从该Stream读出对象即可。
 //使用序列化技术实现深克隆
public object deepClone() throws IOException, ClassNotFoundException, OptionalDataException{
//将对象写入流中
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bao);
oos.writeObject(this); //将对象从流中取出
ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return (WeeklyLog)ois.readObject();
}

原型管理器

原型管理器是将多个原型对象存储在一个集合中供客户端使用,专门负责克隆对象的工厂,类似于简单工厂方法,通过key来获取一个新的对象。

  • 原型管理器中往往使用一个HashTable来管理所有原型对象。
  • 可以提供一个默认的原型对象,如果有新的写入,可以将原有的对象进行覆盖。
  • 读取时,从HashTable中获得原型对象,然后调用原型对象的clone方法获得一个新的对象。

优点:

  • 当创建一个对象比较复杂时,原型模式可以简化其创建过程,通过复制获得和已有实例相同的对象。
  • 简化创建结构,不需要专门的工厂存在,仅需要实现克隆方法即可。

缺点:

  • 克隆方法位于类的内部,家中了类的职责,对已有类进行改造时,需要修改源码。
  • 在实现深克隆时需要较为复杂的代码,存在多重嵌套的问题。

适用场景:

  • 创建新对象的成本比较大,新的对象可以通过原型模式对已有对象进行复制来获得。
  • 如果系统要保存对象状态,并且对象本身占用内存很少,可以使用原型模式配合备忘录模式来实现。

实例:

PrototypePattern.java

六个创建模式之原型模式(Prototype Pattern)的更多相关文章

  1. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  2. 设计模式10---设计模式之原型模式(Prototype)

    1.场景模式 考虑这样一个实际应用:订单处理系统 里面有一个保存订单的功能,当产品数量超过1000份以后,拆成两份订单,再超,那么就再拆.直到每份订单不超过1000为止,订单有两种,一个是个人订单,一 ...

  3. [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)

    一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...

  4. JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象

    一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...

  5. 初涉JavaScript模式 (7) : 原型模式 【三】

    组合使用构造函数模式和原型模式 上篇,我们提到了原型模式的缺点,就是每个实例不能拥有自己的属性,因为纯原型模式所有的属性都是公开给每个实例的,故我们可以组合使用构造函数模式和原型模式.构造函数用来定义 ...

  6. 初涉JavaScript模式 (5) : 原型模式 【一】

    什么是原型模式? 原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象.--引自JavaScript设计模式 我们创建的每一个函数都有一个prototype ...

  7. javacript 组合使用构造函数模式和原型模式

    构造函数模式创建对象 基本方法 function Person(name,age){ this.name=name; this.age=age; this.sayName=function(){ al ...

  8. Java进阶篇设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  9. 【js基础】创建对象的几种常见模式(工厂模式,构造函数模式,原型模式,构造原型组合模式)

    一.工厂模式 缺点:没有解决对象识别的问题 优点:解决了创建多个相似对象的问题 function createPerson(name,age,job){ var o = new Object(); o ...

  10. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

随机推荐

  1. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  2. OOCSS入门学习

    对于面向对象大家肯定都有多多少少的了解,这里所说的OOCSS就是说面向对象的CSS,得说明的是OOCSS并不是一门新语言也不是什么库,而是一种概念和javascript面向对象一样. 可能你这样写过C ...

  3. 让BI告诉你:圣诞老人去哪了?

    刚看到一篇关于圣诞节BI分析的文章,觉得很有意思,特来翻译了下和大家一起分享(可惜的是文章发布的时间有点久). 伴随着圣诞节即将到来的日子,POWER BI团队来回答大家最为关注的一个问题:圣诞老人到 ...

  4. WPF中实现验证码功能

    其实和winform中的实现差不多,只是由于WPF中控件使用的库与winform中的有区别,大体上还是差不多的,直接看代码: 产生验证码的类:ValidCode.cs public class Val ...

  5. 选择排序java代码

    /** * 选择排序 * * 原理:将最小值与数组第1个即array[0]交换,第二次则忽略array[0],直接从array[1]至array[array.length-1]中 * 选择出最小值与a ...

  6. 【原创】.NET读写Excel工具Spire.Xls使用(5)重量级的Excel图表功能

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...

  7. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  8. 结合 CSS3 & Canvas 模拟人行走的效果

    HTML5 和 CSS3 技术给 Web 带来了新的利器,点燃了 Web 开发人员的激情.所谓只有想不到,没有做不到,的确如此.下面给大家分享一个结合 CSS3 & Canvas 模拟人行走的 ...

  9. 前端开发教程:使用 CSS3 Transforms 构建圆形导航

    在本教程中我将告诉你如何使用 CSS 变换来创建圆形导航.教程逐一讲解实现这个样式将要涉及一些基本的数学知识并配合 CSS 变换来创建这些样式.不过不用担心,这里用到的数学知识真的是很简单的.教程使用 ...

  10. Android反编译(三)之重签名

    Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...