前方高能《一故事一设计模式》PDF 电子书已经上线,关注公众号即可获取。

个人公众号原文:
创建型模式:原型模式

五大创建型模式之五:原型模式。

简介

姓名 :原型模式

英文名 :Prototype Pattern

价值观 :效率第一

个人介绍

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
(来自《设计模式之禅》)

又到了一个系列的最后一篇文章了,今天是创建型模式的最后一篇。什么是创建型模式呢?创建型模式是对类的实例化过程进行抽象,使对象的创建和使用分离,从而使代码更加灵活。

我们平时使用最多的一种创建对象方式就是 new ABC(),直接通过构造方法来创建一个对象。通过原型模式来创建对象则不用调用构造方法,就可以创建一个对象。下面来揭开它的面纱。

你要的故事

前几天有出版社的老师邀请写书,鉴于深知自己水平还不足以出书,所以没有合作,还在努力学习,以后有能力有机会再考虑这方面的事情。

今天的故事就从出书讲起。我们知道一本新书发版的时候,会复印很多册,如果销售得好,会有很多个印刷版本。我们来了解复印一批书籍这个过程是怎么实现的。小明写下了下面这段代码。

public class NoPrototypeTest {public static void main(String[] args) {for (int i = 1; i <= 10; i ++) {Book book = new Book("娱乐至死", "尼尔波兹曼", "社会科学", "XXXX");System.out.println("复印书籍:" + book.getName() + ",第 " + i + " 本");}}}class Book {private String name;private String author;private String type;private String content;public Book(String name, String author, String type, String content) {this.name = name;this.author = author;this.type = type;this.content = content;System.out.println("实例化书籍:" + this.name);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}// 打印结果:
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 1 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 2 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 3 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 4 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 5 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 6 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 7 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 8 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 9 本
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 10 本

上面小明的代码复印了 10 本《娱乐至死》,代码逻辑没有问题,有个问题就是复印一本就实例化一次书籍,这个实例化可以减少么?使用原型模式可以实现。小明根据这些提示,重新修改了代码。

public class PrototypeTest {public static void main(String[] args) {Book2 book1 = new ConcreteBook("娱乐至死", "尼尔波兹曼", "社会科学", "XXXX");System.out.println("复印书籍:" + book1.getName() + ",第 " + 1 + " 本");for (int i = 2; i <= 10; i ++) {Book2 book2 = (Book2) book1.clone();System.out.println("复印书籍:" + book2.getName() + ",第 " + i + " 本");}}}/*** 抽象类*/
abstract class Book2 implements Cloneable {private String name;private String author;private String type;private String content;public Book2(String name, String author, String type, String content) {this.name = name;this.author = author;this.type = type;this.content = content;System.out.println("实例化书籍:" + this.name);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overrideprotected Object clone() {try {return super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}
}/*** 具体类*/
class ConcreteBook extends Book2 {public ConcreteBook(String name, String author, String type, String content) {super(name, author, type, content);}
}打印结果:
实例化书籍:娱乐至死
复印书籍:娱乐至死,第 1 本
复印书籍:娱乐至死,第 2 本
复印书籍:娱乐至死,第 3 本
复印书籍:娱乐至死,第 4 本
复印书籍:娱乐至死,第 5 本
复印书籍:娱乐至死,第 6 本
复印书籍:娱乐至死,第 7 本
复印书籍:娱乐至死,第 8 本
复印书籍:娱乐至死,第 9 本
复印书籍:娱乐至死,第 10 本

看,打印结果和第一次实现的结果完全不一样,这一次只实例化了一次,后面复印的书籍都没有实例化。我们看看代码的变化,代码中最最主要的就是 Book2 实现了 Cloneable 接口,这个接口有个 clone() 方法,通过实现这个方法,可以实现对象的拷贝,就是不用调用构造方法,直接通过对内存的拷贝来创建一个新的对象。这就是原型模式的实现方式,通过原型模式可以提高创建对象的效率

代码:
Prototype Pattern

总结

通过原型模式,绕过构造方法创建对象,利用内存直接拷贝对象,提高对象的创建性效率。在有大量的对象创建或者类初始化消耗多资源的场景下可以利用原型模式来优化。当然在实现的过程中,要注意浅拷贝与深拷贝的问题,防止写出 bug,文章主要介绍原型模式,就不详细说这个问题了,留给大家去扩展了解。

参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》

推荐阅读:
创建型模式:单例模式
创建型模式:工厂方法
创建型模式:抽象工厂
创建型模式:原型模式
公众号之设计模式系列文章

希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号:LieBrother,第一时间获取文章推送阅读,也可以一起交流,交个朋友。

创建型模式:原型模式相关推荐

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

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

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

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

  3. JAVA设计模式详解(六)----------状态模式

    各位朋友,本次LZ分享的是状态模式,在这之前,恳请LZ解释一下,由于最近公司事情多,比较忙,所以导致更新速度稍微慢了些(哦,往后LZ会越来越忙=.=). 状态模式,又称状态对象模式(Pattern o ...

  4. 设计模式详解(四)--------建造者模式

    一.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 二.使用范围 1.创建一个复杂的对象,他有多个不同的模块组成,其中有些模块不会改变, ...

  5. 设计模式详解(五)——建造者模式

    一.场景问题 大家很多人应该都玩过LOL(英雄联盟)这款游戏,博主从S4赛季一直玩到现在,可以说这块游戏陪伴了我整个大学生涯.正好现在S10入围赛已经快接近尾声,即将到精彩的小组赛了.当前这篇文章不是 ...

  6. 《设计模式详解》创建型模式 - 工厂模式

    <设计模式详解> 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.2.1 结构 4.2.2.2 实现 4.2.2.3 优缺点 4.2.2.4 扩展 - 静态工厂 4. ...

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

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

  8. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  9. 设计模式详解(四)抽象工厂模式

    文章目录 1. 简介 2. 代码实例 3. 抽象工厂的优缺点 1. 简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类 与工厂方法模式不同(工厂方法的升级,在工厂方法模式 ...

  10. 《设计模式详解》创建型模式 - 原型模式

    原型模式 4.3 原型模式 4.3.1 概述 4.3.2 结构 4.3.3 实现 4.3.4 案例 4.3.5 使用场景 4.3.6 扩展 - 深克隆 引用对象的浅克隆 实现 1:文件流 + 对象流 ...

最新文章

  1. formValidator BUG
  2. 我们究竟应不应该使用框架?
  3. 分布式从mysql查数据_技术分享 | 从库数据的查找和参数 slave_rows_search_algorithms...
  4. cbow word2vec 损失_word2vec是如何得到词向量的?
  5. wordpress html音乐,WordPress引用百度Ting音乐方法
  6. 前端之JavaScript 02
  7. 【Tensorflow】Tensor的比较运算
  8. 基于Spring Security的认证授权_应用详解_会话管理_Spring Security OAuth2.0认证授权---springcloud工作笔记129
  9. 满屏的指标?删了吧,手把手教你裸 K 交易!
  10. python宠物系统_小练习 宠物管理系统
  11. 使用注册表文件(REG)添加、修改或删除windows注册表项和值
  12. [Sencha ExtJS amp; Touch] 在Sencha(Extjs/Touch)应用程序中使用plugins(插件)和mixins(混入)...
  13. 微博商城开启社会化电商之路
  14. asp毕业设计——基于asp+access的网上投票系统设计与实现(毕业论文+程序源码)——网上投票系统
  15. android 双缓冲地图,卡马克卷轴算法的研究地图双缓冲.doc
  16. FTTB FTTC FTTH FTTO FSA
  17. Android Zip 解压与进度 实现,kotlin命令行输入值
  18. 辰奕智能在创业板过会:计划募资约4亿元,约有五成来自境外
  19. 如何制订一个有效的内部规范
  20. 2021-912--51单片机串口通信--SCON方式1

热门文章

  1. 在Linux服务器上安装cmake遇到的小问题
  2. 在C语言中如何取一个数的小数部分?
  3. 读书笔记---金融学一新国富论
  4. NoSql之深入浅出redis
  5. java xfire client_XFire的Client的三种模式(转)
  6. Flash的破解与加密
  7. 2022年江苏省建筑三类人员(项目负责人B证)练习题及答案
  8. php验证码大全(实例分享),php图片验证码的例子
  9. C++——虚函数、虚析构函数、纯虚函数、抽象类
  10. android设备udid,Android下获取设备唯一标识(UDID, DeviceID...)