大家好呀,今天又又又是设计模式的一天!跟着洪爵轻松学完设计模式~

​ 今天要讲的是原型模式,大家可能都听过原型模式,因为在spring中你可以给bean配置成原型模式,或者是单例模式,如果是原型模式,那么每次去获取这个bean的时候,都会去生成一个新的对象

​ 原型模式,是一种创建型模式它用在创建重复的对象的场景,并且保证它的性能。原型模式需要实现Cloneable接口,那么既然每次返回的都是一个新对象,那么我为什么不直接使用new呢?洪爵知道大家有这样的问题,所以也写有相关的文章,贴在了本篇文章的下方啦!其实通俗的说,clone是本地方法,基于内存的二进制流的复制,在性能上比直接new一个对象会更加的高效,并且还有一点很重要,就是内存的优化上,具体可以看洪爵的文章,已经贴在本篇文章下方

​ 那么为什么叫做原型模式?它一开始会获取到一个对象,这个对象是我们告诉它的,然后它会根据这个原有的原型对象,快速地生成和原型对象一样的实例对象

我们抽象出一个原型类,Prototype,实现了Cloneable接口。

然后具体的原型类ConcretePrototype可以继承自抽象原型类Prototype。

最后需要有一个保存每个具体原型对象的地方A,当需要创建具体原型类的时候,直接从地方A去拿到原型对象进行克隆,返回一个新的对象

上代码,充分了解原型模式:

public abstract class Ball implements Cloneable {private String id;protected String name;abstract void show();public String getName() {return this.name;}public void setId(String id) {this.id = id;}public String getId() {return id;}public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}public class Badminton extends Ball {public Badminton() {this.name = "羽毛球";}void show() {System.out.println(name + "呀");}
}public class Basketball extends Ball {public Basketball() {name = "篮球";}void show() {System.out.println(name + "呀");}
}public class TableTennis extends Ball {public TableTennis() {name = "乒乓球";}void show() {System.out.println(name + "呀");}
}public class BallCache {private static ConcurrentHashMap<String, Ball> ballMap = new ConcurrentHashMap();static {Basketball basketball = new Basketball();basketball.setId("1");ballMap.put(basketball.getId(), basketball);Badminton badminton = new Badminton();badminton.setId("2");ballMap.put(badminton.getId(), badminton);TableTennis tableTennis = new TableTennis();tableTennis.setId("3");ballMap.put(tableTennis.getId(), tableTennis);}public static Ball getBall(String id) {Ball ball = ballMap.get(id);return (Ball) ball.clone();}
}public class Client {public static void main(String[] args) {Badminton badminton1 = (Badminton) BallCache.getBall("2");Basketball basketball1 = (Basketball) BallCache.getBall("1");TableTennis tableTennis1 = (TableTennis) BallCache.getBall("3");badminton1.show();basketball1.show();tableTennis1.show();Badminton badminton2 = (Badminton) BallCache.getBall("2");Basketball basketball2 = (Basketball) BallCache.getBall("1");TableTennis tableTennis2 = (TableTennis) BallCache.getBall("3");badminton2.show();basketball2.show();tableTennis2.show();System.out.println(badminton1.equals(badminton2));System.out.println(basketball1.equals(basketball2));System.out.println(tableTennis1.equals(tableTennis2));}
}羽毛球呀
篮球呀
乒乓球呀
羽毛球呀
篮球呀
乒乓球呀
false
false
false

​ 好啦,希望本篇文章有助你了解原型模式,孙悟空猴毛变出的小猴子,到底是不是使用的原型模式呢?下方留言告诉我

愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。

道阻且长,往事作序,来日为章。

期待我们下一次相遇!

原型模式,孙悟空都会用,猴毛变出的小猴子!相关推荐

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

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

  2. 10Prototype(原型)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Prototype(原型)模式动机 在软件系统中,经常面临着某些结构复杂对象的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是它们 ...

  3. (二十三)原型模式详解(clone方法源码的简单剖析)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...

  4. 设计模式-值类型与引用类型、深拷贝与浅拷贝、原型模式详解

    一. 值类型和引用类型 1. 前言 (1). 分类 值类型包括:布尔类型.浮点类型(float.double.decimal.byte).字符类型(char).整型(int.long.short等). ...

  5. 创建型模式—原型模式

    原文作者:C语言中文网 原文地址:原型模式(原型设计模式)详解 目录 原型模式的定义与特点 原型模式的结构与实现 原型模式的应用实例 原型模式的应用场景 原型模式的扩展 在有些系统中,存在大量相同或相 ...

  6. 对象的克隆——原型模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/7424559 张纪中版<西游记>以出乎意料的造型和雷人的台词遭到广大观众朋友的热 ...

  7. java设计模式中—原型模式

    文章目录 原型介绍 实现 原型模式 原型中拷贝 浅拷贝 深拷贝 使用clone 方式 序列化方式 总结 原型介绍 举个栗子:大话西游里,孙悟空对战牛魔王,孙悟空拔了一个猴毛一吹,变出了一堆" ...

  8. 23种设计模式之单例模式、工厂模式、原型模式、建造者模式

    系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...

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

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

  10. java设计模式--2.原型模式

    原型模式的定义与特点 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象.在这里,原型实例指定了要创建的对象的种类.用这种方式 ...

最新文章

  1. mysql时间复杂度o的n次方_MySQL性能测试调优
  2. C#中的三种委托方式:Func委托,Action委托,Predicate委托
  3. 4690s i5_秒杀i7?小恶魔i5-4690K对决i7-4770K
  4. oracle修改物化视图字段,获取物化视图字段的修改矢量(一)
  5. 前端学习(2982):一文理解undefine
  6. Linux按键驱动,中断实现流程
  7. [网络流24题]试题库问题
  8. java解析json的一种方法
  9. 复杂高端木马USB窃贼出现
  10. Visual Basic从入门到精通pdf
  11. c语言学生综合测评系统_学生综合评价系统
  12. 如何放大缩小地图 和 移动拖动 地图 (一张的那种,厂区地图非世界地图)
  13. 放大镜 讲课_《放大镜》的教学设计
  14. U盘的两个文件夹不见了,但它还是占着我的空间,为什么?
  15. 考研前夕 — 成人的世界里没有那么多童话
  16. 有效数字修约,按四舍六入五成双原则
  17. python计算bmi的编程_Python学习-计算BMI的小程序
  18. zynq系列之-----PS端iic使用
  19. MTK5G-MT6853(天玑720)
  20. yaml语法 关于key为中文时的问题

热门文章

  1. linux下使用opengL Glad + EGL问题记录
  2. 古风排版 python
  3. golang 之时间国际化
  4. 利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分
  5. 排队论----学习反馈
  6. 基于Php+MySql数据库架构的网络验证系统
  7. 活动图中创建泳道(UML2活动框图创建泳道图例和操作流程)
  8. Windows 下安装FastDFS客户端fdfs-client-py
  9. 浏览器自定义横向滚动条_自定义滚动条–跨浏览器解决方案
  10. Django项目实战——10—(修改地址前后端逻辑、删除地址前后端逻辑、设置默认地址、修改密码、虚拟机安装docker/FastDFS、电商-商品知识、首页广告数据库表分析、商品信息数据库表分析)