本文源码见:https://github.com/get-set/get-designpatterns/tree/master/prototype

原型模式(Prototype Pattern)用于创建重复的对象,这种类型的设计模式属于创建型模式,与工厂模式类似,不同在于工厂模式通过new的方式创建对象,而原型模式通过复制既有对象的方式创建对象。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

例子

既然原型模式也是创建型模式,那么我们就用之前工厂模式的例子,也方便比较不同点。

我们在用画图软件或做PPT的时候经常用到的操作就是复制图形。为什么复制呢?因为现画一个图形比较麻烦嘛,需要调整大小、设置填充色、边框颜色、图形内字体大小颜色等等。这也是原型模式用到的一种场景,那就是当类属性多而且复杂的时候,在new的时候传入各种参数给构造方法,不如直接用一个现有的对象直接复制一个来的痛快。

假设我们在用PPT作图,无论是圆形、矩形还是三角形,都有填充颜色和边框颜色,以及图形内文字,因此可以抽象出一个Shape的抽象类,并且重写了clone方法(关于Java的clone,请参考上篇文章“番外篇 - Java的clone”)。

Shape.java

public abstract class Shape implements Cloneable {protected String type;protected String fillColor;protected String frameColor;protected String innerText;@Overridepublic Shape clone() throws CloneNotSupportedException {return (Shape)super.clone();}public abstract void draw();// getters & setters ... ...}

各种不同的图形均继承Shape,同样也继承了其clone()方法。

Circle.java

public class Circle extends Shape {public Circle() {this.type = "circle";}public void draw() {System.out.println("Draw a " + type + ", fill with " + fillColor + ", frame color is " + frameColor + ", inner text is [" + innerText + "].");}
}

Rectangle.java

public class Rectangle extends Shape {public Rectangle() {this.type = "rectangle";}public void draw() {System.out.println("Draw a " + type + ", fill with " + fillColor + ", frame color is " + frameColor + ", inner text is [" + innerText + "].");}
}

Triangle.java

public class Triangle extends Shape {public Triangle() {this.type = "triangle";}public void draw() {System.out.println("Draw a " + type + ", fill with " + fillColor + ", frame color is " + frameColor + ", inner text is [" + innerText + "].");}
}

下面我们来在main方法中使用一下这个原型复制的能力。

Client.java

public static void main(String[] args) throws CloneNotSupportedException {Shape circle1 = new Circle();circle1.setFillColor("red");circle1.setFrameColor("green");circle1.setInnerText("Design patterns");circle1.draw();Shape circle2 = circle1.clone();circle2.draw();
}

输出为:

Draw a circle, fill with red, frame color is green, inner text is [Design patterns].
Draw a circle, fill with red, frame color is green, inner text is [Design patterns].

这就是原型模式。

总结

通过上述内容,你大概也知道了原型模型的应用场景,那就是“当new一个对象成本较高的时候”,再举几个例子:

  1. 当一个系统应该独立于它的产品创建,构成和表示时。
  2. 当要实例化的类是在运行时指定时,例如,通过动态装载。
  3. 为了避免创建一个与产品类层次平行的工厂类层次时。
  4. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

除此之外,还有别的好处哟:

  1. 性能好。在上一篇番外篇 - Java的clone中说到,clone()是源自Object类中的native方法,其执行效率相对较高。
  2. 可以逃避构造方法的束缚,因为不需要new了嘛。

使用原型模式有几点注意事项:

  1. 类本身或其父类必须实现Cloneable接口,并用publicclone()方法覆盖Object的同名方法;
  2. 根据实际情况判断是”浅复制“还是”深复制“,若深复制用序列化方式实现,则类本身或其父类须实现Serializable接口;
  3. 实际开发过程中注意业务逻辑,比如id等成员要保证不重复。

其实结合最近几个设计模式的例子,你可能会发现,我前边介绍到的设计模式的类关系模型,有些是同GoF的一致的,有些是有差别的。其实看网上其他的设计模式的博文介绍也有这种感觉,那就是似乎感觉同样一个设计模式,不同的文章介绍出来类关系怎么不一样。比如对于抽象,有的是用接口,有的是用抽象类;比如对于继承关系,有的是一层,有的是两层。这时候总有些不知所措:到底哪个是正宗的呢?

其实对于设计模式,大可不必追求“正宗”,就像到了长沙,各种臭豆腐店,尝遍之后也很难说哪个是正宗的,但是它们都有共同点:基本是黑色的黑暗料理,闻起来有点臭但是吃起来香,烹饪方法都是油炸等等。抓住这些基本特点,只要好吃,那就OK咯~说回设计模式,归根到底是对“面向对象思想”应用的一些成熟的模型,不要“拿来主义”生搬硬套,抓住核心特征,符合实际情况即可,所谓“无招胜有招”嘛。

那么对于原型模式,其核心特征在于clone

转载于:https://blog.51cto.com/liukang/2044649

Java设计模式百例 - 原型模式相关推荐

  1. Java设计模式百例(番外) - Java的clone

    本文源码见:https://github.com/get-set/get-designpatterns/tree/master/prototype 本文是为下一篇"Java设计模式百例 - ...

  2. java设计模式之五(原型模式)

    什么是原型模式? 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 当我们程序中有几个相似但又不 ...

  3. java设计模式 桥接_Java设计模式百例 - 桥接模式

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使得 ...

  4. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  5. fcq java_Java设计模式百例 - 解释器模式

    解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式在我们开发过程中并不常用 ...

  6. 重学 Java 设计模式:实战原型模式「上机考试多套试,每人题目和答案乱序排列场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  7. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  8. java设计模式3--单例模式(Singleton)

    本文地址:http://www.cnblogs.com/archimedes/p/java-singleton-pattern.html,转载请注明源地址. 单例模式 保证一个类仅有一个实例,并提供一 ...

  9. 【设计模式 06】原型模式(克隆??)

    原型模式(clone?) Prototype pattern refers to creating duplicate object while keeping performance in mind ...

  10. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

最新文章

  1. 亚马逊是如何进行软件开发的
  2. 基于OpenCV平滑图像
  3. tensorflow和python不兼容_tensorflow与numpy的版本兼容性问题的解决
  4. Windows 7 上怎样打开SQL Server 配置管理器
  5. mysql-proxy完成mysql读写分离
  6. virtualenv在ubuntu系统中的缺点
  7. goto语句_11. Go语言流程控制:goto 无条件跳转
  8. mysql并发_MySQL并发更新数据时的处理方法
  9. C# 读取Excel CSV 类型文件到DataSet中,反之从DataSet写入excel
  10. java core 作者_java core dump分析实战
  11. iOS-国家代码选择功能github开源分享
  12. java 解压文件夹_java新人,在学习解压缩文件时,解压文件后,里面的文件变文件夹...
  13. 电子工程专业用得最多的17种软件,你哪个用得好?
  14. 社会工程学攻击选项是_什么是社会工程学,如何避免?
  15. [转]Facebook 如何存储150亿张、1.5PB的照片
  16. 每次启动虚拟机都要重装虚拟机的操作系统
  17. vim编辑多文件,多窗口,切换窗口,切换文件命令
  18. SMTP命令与ESMTP命令简介(附带命令通信)
  19. Koffee设计模式学习之路(一) —— 模式学习总结思路
  20. STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制

热门文章

  1. 深夜,基友给我发了个某短视频app,我没忍住把它给...
  2. Android性能提升之强引用、软引用、弱引用、虚引用使用
  3. 公众号 多服务器配置_多领国微信官方公众号在线
  4. Ubuntu 问题合集
  5. java适配器模式 场景_详解Java适配器模式
  6. java第二章_Java第二章基本语法
  7. mysql upsert语法_mysql – SQL标准UPSERT调用
  8. 计算机辅助设计与制造考试重点,计算机辅助设计与制造复习内容
  9. c语言实验二作业,C语言实验作业8 - osc_5p0xffsa的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. php 无符号位移怎么使用,,(有符号位移)和(无符号位移)的使用方法,及差别...