定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

类型:创建类模式

类图:

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  • 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

  原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。

Java实现代码:

class Prototype implements Cloneable {  public Prototype clone(){  Prototype prototype = null;  try{  prototype = (Prototype)super.clone();  }catch(CloneNotSupportedException e){  e.printStackTrace();  }  return prototype;   }
}  class ConcretePrototype extends Prototype{  public void show(){  System.out.println("原型模式实现类");  }
}  public class Client {  public static void main(String[] args){  ConcretePrototype cp = new ConcretePrototype();  for(int i=0; i< 10; i++){  ConcretePrototype clonecp = (ConcretePrototype)cp.clone();  clonecp.show();  }  }
} 

原型模式的优点及适用场景

使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

原型模式的注意事项

  • 使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
  • 深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。例如:
public class Prototype implements Cloneable {  private ArrayList list = new ArrayList();  public Prototype clone(){  Prototype prototype = null;  try{  prototype = (Prototype)super.clone();  prototype.list = (ArrayList) this.list.clone();  }catch(CloneNotSupportedException e){  e.printStackTrace();  }  return prototype;   }
} 

由于ArrayList不是基本类型,所以成员变量list,不会被拷贝,需要我们自己实现深拷贝,幸运的是java提供的大部分的容器类都实现了Cloneable接口。所以实现深拷贝并不是特别困难。

PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。

转载于:https://www.cnblogs.com/phpdragon/p/8527662.html

23种设计模式[5]:原型模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式

    · 原型模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,克隆模式算是一个人气比较高的娱乐模式了,因为该模式下双方可以各有五个一模一样的英雄,可以带给玩家不同的游戏体验,特别是有一些比较好玩的英雄, ...

  2. 23天读懂23种设计模式:原型模式(创建型)

    点击上方 蓝字 关注我们 创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建.组合和表示方式. 原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  3. 23种设计模式之原型模式代码实例

    原型模式就是利用一个克隆"原型"来产生新对象的一种模式, 克隆又分浅克隆与深克隆, 浅克隆:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的. ...

  4. 23种设计模式之原型模式

    原型模式的定义 定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象. 通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象 原型模式的核心是一个 c ...

  5. 《23种设计模式之原型模式(2种实现)》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  6. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  7. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  8. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  9. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  10. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

最新文章

  1. 数据流和十六进制转换
  2. 学习笔记-记ActiveMQ学习摘录与心得(一)
  3. poj 2503(字符串hash)
  4. Raspbian安装Opencv3
  5. 求递归算法时间复杂度:递归树
  6. 授人以鱼不如授人以渔,UCHome全面大解析培训【第二集】
  7. 克罗谈投资策略05_涨势买入,跌势卖出
  8. 关于Vue.js去掉#号路由
  9. 2016-6-4 项目结构调整完成
  10. openssh常用命令记录
  11. HDU - 5950 Recursive sequence(矩阵快速幂)
  12. 获取浏览器的User Anent及判断微信浏览器
  13. opencv 图像去雾
  14. 在线脑图思维导图生成工具
  15. python猴子分桃_Python 五猴分桃.py问题解答代码
  16. 快速删除node_modules(rimraf)
  17. linux运维工程师到底是做什么的?
  18. 如何使用SQL批量替换数据库特定字段中部分特定数据
  19. 大众易融迎“端午”活动公告
  20. ABAP inner join 性能影响

热门文章

  1. PadLeft 和 PadRight
  2. 11步提高代码质量和整体工作效率
  3. 《财富》:盖茨的四项黄金法则
  4. spring boot的hello world小实验
  5. sublime的TAB和空格统一
  6. Opengl :公转与自转
  7. linux echo命令
  8. Xception论文阅读笔记
  9. 让0球平局怎么算_半场16中5+0助攻+空气球,欧文威化,看看众美媒怎么说?
  10. 微信小程序自定义组件,提示组件