定义:

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

结构图:

  • 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. 每天一个linux命令(26):用SecureCRT来上传和下载文件

    用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...

  2. TypeScript实例

    interface Person { firstName: string, lastName: string } function greeter(person: Person) { return p ...

  3. ASP.NET中使用DataGrid控件按照条件显示GridView单元格的颜色

    问题描述: 我在做一个关于信用卡管理系统时遇到一个问题:信用卡内金额低于100元时,数字颜色显示为红色,其余显示为绿色 之前,尝试了修改成为模板列以及转换成Reapeater控件,甚至用了Jquery ...

  4. 用CSS text-transform转换字母大小写

    以前我们都是用JS来实现字母的首字母大小写的,但现在没有必要了,CSS完全可以实现,话说兼容性还好从IE6开始就支持了. text-transform:none | capitalize | uppe ...

  5. ASP.NET MVC中使用FluentValidation验证实体

    1.FluentValidation介绍 FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的 ...

  6. 一次意外的X锁不阻塞问题

        最近有一个朋友问我一个关于给查询操作强制上X锁却不阻塞的问题.该查询写在一个存储过程中,代码如代码1所示: 1: create PROC [dbo].[GetCityOrders] 2: @c ...

  7. Github快速入门手册

    最近在试用Github,开源的思想也让人觉得把一些经验分享出来是非常好的事情.附件是doc文件,如有需要请注意查收.希望能对你有帮助. GITHUB基于互联网的版本控制快速入门手册 如有不妥,欢迎指正 ...

  8. jsoup简单的爬取网页数据

    /** * Project Name:JavaTest * File Name:BankOfChinaExchangeRate.java * Package Name:com.lee.javatest ...

  9. MemCache分布式缓存的一个bug

    Memcached分布式缓存策略不是由服务器端至支持的,多台服务器之间并不知道彼此的存在.分布式的实现是由客户端代码(Memcached.ClientLibrary)通过缓存key-server映射来 ...

  10. selenium-webdriver(python) (十五) -- 鼠标事件

    本节重点: ActionChains 类 context_click()  右击 double_click()   双击 drag_and_drop()  拖动 测试的产品中有一个操作是右键点击文件列 ...