不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学。

前言

西游记中孙悟空拔毛出分身的故事大家都知道,孙悟空根据了自己的形象创建了分身,克隆出了一个和自己几乎一模一样的身外身,设计模式中也有一个类似的模式,叫做克隆模式,它是属于创建型模式的一种模式

什么是原型模式 Prototype  Pattern

使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的对象,这就是克隆模式

原型模式的优点

(1)、当创建新的对象相对而言比较麻烦时,我们可以使用原型模式简化对象的创建过程,通过复制一个已有的实例可以提高新实例的创建效率

(2)、原型模式的拓展性是很好的。由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体类写入配置文件中,增加或者减少具体原型类对原有系统都没有任何影响

(3)、原型模式提供了简化的创建模式,对比工厂模式中常常需要有一个与产品等级结构相同的工厂等级结构,而原型模式不需要这样,原型模式是通过自己本身就封装好的原型类的克隆方法实现的,无须专门的工厂类创建产品。

(4)、可以使用深克隆模式来保存对象的状态,辅助实现撤销的操作。

原型模式的劣势

(1)、实现原型模式需要给每一个类配置一个克隆的方法,且该方法位于类的内部,当对已有的类修改时会违背开闭原则

(2)、实现深克隆需要实现较为复杂的代码,而且对象之间存在多重关系的嵌套引用时,为了实现深克隆每一个类都需要支持深克隆,实现起来会比较麻烦

原型模式的使用场景

(1)、创建的成本比较大(比如初始化需要比较长的时间,占用太多的CPU或者网络资源)

(2)、如果系统需要保存对象的状态,而对象状态变化很小,或者对象本身占用内存比较少

(3)、避免使用分层次的工厂类来创建分层次的对象。

浅克隆和深克隆的区别

原型模式又有两种,浅克隆只克隆对象本身,而对象内包含的对象不会克隆,只会引用同一个位置的包含的对象

深克隆会将对象本身和被对象包含的对象都会克隆一份。

原型模式的具体实现

(1)、浅克隆(只需要实现Cloneable接口)

public class WeeklyLog implements Cloneable {private String name;private String date;private String context;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getContext() {return context;}public void setContext(String context) {this.context = context;}public WeeklyLog clone() {Object obj = null;try {obj = super.clone();return (WeeklyLog) obj;} catch (CloneNotSupportedException e) {System.out.println("不支持复制");e.printStackTrace();return null;}}
}

(2)、深克隆(实现 Serializable 接口)

// Cloneable潜克隆所使用的java接口
//深克隆使用序列化接口
public class WeekLog implements Serializable {private String name;private String date;private String content;private Attachment attachment;//使用序列号实现深克隆public WeekLog deepLone()throws  Exception{//将对象写入流中ByteArrayOutputStream bao=new ByteArrayOutputStream();ObjectOutputStream oos=new ObjectOutputStream(bao);oos.writeObject(this);//将对象从流中取出ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois=new ObjectInputStream(bis);return (WeekLog) ois.readObject();}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Attachment getAttachment() {return attachment;}public void setAttachment(Attachment attachment) {this.attachment = attachment;}
}
import java.io.Serializable;
//实现序列号接口,做到深克隆
public class Attachment implements Serializable {private String name;public void download(){System.out.println("下载附件,名字为"+name);}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

设计模式的艺术 创建型模式之原型模式相关推荐

  1. 设计模式(创建型)之原型模式

    GOF 给原型模式 的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 在 C++和Java 中都提供了clone()方法来实现对象的克隆,但是在Java中必须要实现Clone ...

  2. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  3. 《深入设计模式》笔记 -创建型模式四、原型模式

    原型模式 亦称: 克隆.Clone.Prototype 意图 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 问题 如果你有一个对象, 并希望生成与其完全相同 ...

  4. 《深入设计模式》笔记 -创建型模式二、工厂方法模式

    抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类. 问题 假设你正在开发一款家具商店模拟器. 你的代码中 ...

  5. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  6. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  7. Java经典设计模式:五大创建型模式

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  8. 设计模式之六个创建型模式的相关知识,简单易懂。

    一. 简单工厂模式-Simple Factory Pattern 1) 工厂三兄弟之简单工厂模式(一) 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高 ...

  9. 【设计模式·Python】创建型模式

    设计模式中,创建型模式主要由以下几种: 工厂方法模式 抽象工厂模式 建造者模式 原型模式 单例模式 简单工厂模式 不直接向客户暴露对象的实现细节,而是通过一个工厂类来负责创建产品的实例. 角色: 工厂 ...

最新文章

  1. ffmpeg + opencv 实现视频播放器(没有声音)
  2. groovy --不注意的小错误(java.lang.String.positive() is applicable)
  3. hdu 5062(dp)
  4. php判断是否是关联数组,php 关联数组判断是否为空
  5. 前端 学习笔记day47 其他标签
  6. SpringBoot实战(十四):Spring Boot Admin 集成安全模块
  7. Atitit.木马病毒 webftp 的原理跟个设计
  8. 惠普bios硬重置_惠普重置BIOS
  9. 最大流 (Maximum Flow) 之 流网络和流
  10. 冰点下载:数据解析错误
  11. 自然语言处理入门(4)——中文分词原理及分词工具介绍
  12. C# 串口驱动封装成类库
  13. 重启共享文件服务器,windows server 2008 文件服务器不定期出现大量CLOSE_WAIT状态的连接,必须重启服务器,客户端才能访问共享。...
  14. 故事感悟:管道与挑水
  15. 用python画卡通人物的画法_教你绘制扁平化风格的卡通人物肖像
  16. css3自学教学,css3精通学习教程(全).pdf
  17. 疫情下的远程办公,充满了崩溃与机遇
  18. 用中文日淘:“日亚”的近85万件商品进驻亚马逊中国
  19. Docker系列六EPIC领游戏
  20. MySQL 主从架构在线热迁移MGR 方案

热门文章

  1. SQLAlchemy.exc部分错误总结
  2. 笔记本电源适配器为什么总坏_为什么某些交流适配器和电源会发出啸叫声?
  3. mybatis自定义动态sql传入对象
  4. 【先楫HPM6750系列】PWM驱动蜂鸣器发声
  5. windows实现支付宝在线支付 python
  6. 如何打开.jar文件
  7. 实例变量、静态变量、局部变量的生命周期
  8. 谷歌浏览器中placeholder在获取光标后不消失的解决方案
  9. 搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南
  10. 复现 R3Det-pytorch RTX3080ti