什么是原型模式?

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

当我们程序中有几个相似但又不太一样的对象时,就可以使用原型模式。简单一些说的话,就是通过深拷贝的方法用原型实例指定创建对象的种类

Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。

图示

我们可以举个例子,比如现在有三个形状对象,圆形(Circle),正方形(Square),长方形(Rectangle)。现在我们想要通过原型模式创建这三个对象,那就需要有一个原型实例 :形状(Shape),让它实现java的接口类Cloneable,并且重写克隆方法clone()。

然后我们定义一个类 ShapeCache,该类把 shape 对象存储在一个 Hashtable 中,并在请求的时候返回它们的克隆。最后通过PrototypePatternDemo 类使用 ShapeCache 类来获取 Shape 对象。

实现

步骤1

//定义原型类,实现java接口
public abstract class Shape implements Cloneable{private String id;protected String type;//需要子类实现的方法abstract void draw();public String getId() {return id;}public void setId(String id) {this.id = id;}public String getType() {return type;}//重写克隆类public Object clone(){Object clone = null;try{clone = super.clone();} catch (CloneNotSupportedException e){e.printStackTrace();}return clone;}}

步骤2
实现具体对象 圆形(Circle),正方形(Square),长方形(Rectangle)

public class Circle extends Shape{public Circle(){type = "Circle";}@Overridevoid draw() {System.out.println("Inside Circle::draw() method");}
}
public class Square extends Shape{public Square(){type = "Square";}@Overridevoid draw() {System.out.println("Inside Square::draw() method");}
}
public class Rectangle extends Shape{public Rectangle(){type = "Rectangle";}@Overridevoid draw() {System.out.println("Inside Rectangle::draw() method");}
}

步骤3
通过调用原型对象克隆方法,创建指定对象

import java.util.Hashtable;public class ShapeCache {private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();public static Shape getShape(String shapeId){Shape shapeCache = shapeMap.get(shapeId);return (Shape)shapeCache.clone();}public static void loadCache(){Circle circle = new Circle();circle.setId("1");shapeMap.put(circle.getId(), circle);Square square = new Square();square.setId("2");shapeMap.put(square.getId(), square);Rectangle rectangle = new Rectangle();rectangle.setId("3");shapeMap.put(rectangle.getId(), rectangle);}
}

步骤4
main()方法检查结果

public class PrototypePattenDemo {public static void main(String[] args) {ShapeCache.loadCache();Shape cloneShape1 = (Shape)ShapeCache.getShape("1");System.out.println("Shape: "+ cloneShape1.getType());System.out.println("Shape: "+ cloneShape1.getId());cloneShape1.draw();System.out.println("------------------------------");Shape cloneShape2 = (Shape)ShapeCache.getShape("2");System.out.println("Shape: "+ cloneShape2.getType());System.out.println("Shape: "+ cloneShape2.getId());cloneShape2.draw();System.out.println("------------------------------");Shape cloneShape3 = (Shape)ShapeCache.getShape("3");System.out.println("Shape: "+ cloneShape3.getType());System.out.println("Shape: "+ cloneShape3.getId());cloneShape3.draw();System.out.println("------------------------------");}
}

java设计模式之五(原型模式)相关推荐

  1. java设计模式之原型模式和建造者模式的写法(二)

    背景 原型模式和建造者模式属于创建型模式,在开发中经常会用到,那么这两种设计模式是怎么写的呢,下面进行代码演示. 原型模式 原型模式的核心就是复制 package com.example.protot ...

  2. 北京Java培训 | java设计模式之原型模式

    克隆羊问题 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom羊 属性完全相同的10只羊. 传统方式解决克隆羊问题 传统的方式的优缺点 1) 优点是比较好理解,简 ...

  3. java prototype是什么,java设计模式-原型模式(Prototype)

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

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

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

  5. 【Java设计模式】原型模式

    ✍ 在软件系统中 , 有些对象的创建过程较为复杂 , 而且有时候需要频繁创建 , 原型模式通过给出一个原型对象来指明所要创建的对象的类型 , 然后用复制这个原型对象的办法创建出更多同类型的对象, 这就 ...

  6. 【Java设计模式】原型模式、建造者模式

    原型模式 概述 用一个已经创建的实例体为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的的clone ()方法. 具体原 ...

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

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

  8. Java设计模式之原型模式(浅克隆,深克隆)

    一.原型模式: 概述: 创建型模式之一,它通过复制一个已有对象来获取更多相同或相似的对象,可提高对象创建效率,简化创建过程. 原理: 将一个原型对象传给要发动创建的对象(如客户端对象),这个客户端对象 ...

  9. Java 设计模式之原型模式

    原型模式主要用于复制对象,尤其是创建过程很复杂的情况,原型模式可以简化创建过程,提高性能,一般用于一个对象的属性已经确定,需要产生很多相同对象的时候,其实很少使用这种模式. 实现原型模式需要两点:第一 ...

  10. Java设计模式之原型模式

    原型模式(Prototype Pattern)属于对象创建型模式,通过克隆指定原型对象创建新对象. 优点: 效率高:原型模式可以简化创建对象的创建过程,通过克隆一个已有的实例可以提高新实例的创建效率: ...

最新文章

  1. java正则表达式及api_JAVA常用API:正则表达式regular expression
  2. 使用Docker for Windows初体验
  3. [云炬ThinkPython阅读笔记]2.6 字符串运算
  4. lumanager mysql_LuManager单独安装mysqli
  5. C++输入一个整数后接着输入字符串
  6. win7 mysql 密码_笔记本win7系统下mysql忘记密码的最佳解决方法
  7. 47 - 算法 - Leetcode-160 -相交链表
  8. 景驰无人车总部落户广州:明年最低量产500辆,回应百度官司
  9. 初识视觉SLAM:用相机解决定位和建图问题
  10. Cisco 静态NAT、动态NAT配置
  11. 《遥感原理与应用》孙家抦版知识点总结(含简答题)——第二章
  12. Proxmark3初学:用PM3克隆M1普通门禁卡方法
  13. 国外开放知识图谱_什么是开放知识,如何传播?
  14. Unity3D学习——使用PUN写一个聊天功能
  15. TMS320F28335 - eCAP、eQEP
  16. 各大IT公司 技术博客汇总
  17. MySQL使用group by分组查询每组最新的一笔数据
  18. elementUI el-upload传额外的参数
  19. VirtualProtect 3方法 -seh ret-ASLR-dep-Adrenalin Player 2.2.5.3
  20. 测试你适合的发型软件叫什么,有没有测试发型的app 测试自己适合什么发型

热门文章

  1. “美国鹦鹉”们对中国有什么样的狼子野心?
  2. 【Python开发】8. 文件操作
  3. 笔记本无线网络连接不可用怎么办
  4. live-server 的使用
  5. goahead php 例子,[转载]Goahead的一些参考例子
  6. MyBatis的Mapper接口以及Example的实例函数及详解
  7. mysql的like字段名_MySQL LIKE 字句使用详情
  8. 计算机局域网访问诲康硬盘,鐖诲康浠€涔堬紝鎰忔€濓紵
  9. STM32CubeMX配置ADC采样(轮询、中断、DMA)
  10. 低调做人,才可高调行事