文章目录

  • I . 原型模式 概念简介
  • II . 原型模式 使用场景
  • III . 原型模式 优缺点
  • IV . 原型模式 实现及 简单示例

I . 原型模式 概念简介


原型模式 : 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

① 设计模式类型 : 创建型设计模式 ;

② 原型实例对象 : 给出原型实例对象 , 根据该对象创建新对象 ;

③ 创建对象类型 : 创建对象的种类由原型的实例对象类型确定 ;

④ 创建方式 : 不调用构造函数 , 而是通过克隆原型的实例对象 , 使用现有对象创建另一个相同类型的对象 , 隐藏创建细节 ;

II . 原型模式 使用场景


原型模式使用场景 : 原型模式的目的是 降低实例对象个数 , 减少构造函数的调用次数 ;

① 类初始化消耗资源过多 : 如果类初始化时消耗过多的资源 , 如这个类中某个成员占用大量内存 , 为了节省开销 ;

② 初始化繁琐耗时 : 类对象创建时经过大量的计算 , 或与本地资源 ( 数据库 , 文件 ) 频繁交互 , 每次创建消耗大量的 CPU 与 时间资源 ;

③ 构造函数复杂 : 类中定义的构造函数复杂 ;

④ 实例对象数量庞大 : 如果在内存中循环创建了很多该实例对象 , 就可以使用原型模式复用不用的对象 , 用于创建新对象 ;

III . 原型模式 优缺点


1 . 原型模式优点 : 性能高 , 简单 ;

① 性能高 : 使用原型模式复用的方式创建实例对象 , 比使用构造函数重新创建对象性能要高 ; ( 针对类实例对象开销大的情况 )

② 流程简单 : 原型模式可以简化创建的过程 , 可以直接修改现有的对象实例的值 , 达到复用的目的 ; ( 针对构造函数繁琐的情况 )

2 . 原型模式缺点 : 实现复杂 , 坑多 ;

① 覆盖 clone 方法 ( 必须 ) : 必须重写对象的 clone 方法 , Java 中提供了 cloneable 标识该对象可以被拷贝 , 但是必须覆盖 Object 的 clone 方法才能被拷贝 ;

② 深拷贝 与 浅拷贝 风险 : 克隆对象时进行的一些修改 , 容易出错 ; 需要灵活运用深拷贝与浅拷贝操作 ;

IV . 原型模式 实现及 简单示例


1 . 原型模式实现 :

① 对象创建原理 : 创建实例对象时使用原型模式 , 就是调用类的 clone 方法 , 直接克隆拷贝现有的实例对象 , 生成新的对象 ;

② 实现 Cloneable 接口 : 原型模式类需要实现 Cloneable 接口 , 如下面的 Student 类 ( class Student implements Cloneable ) 就实现了该接口 ;

③ 重写 clone() 方法 : 通常情况下直接调用父类的 clone 方法即可 , 这种方式是浅拷贝 ,

protected Object clone() throws CloneNotSupportedException{}

2 . 原型模式类代码示例 :

① 代码实现 : Student 类实现 Cloneable 接口 , 重写了 clone() 方法 , 直接调用父类的 clone() 方法 ;

② 地址打印 : 注意 toString 中调用到了父类的打印方法 , super.toString() , 该方法打印 类名@地址 信息 , 可以帮助我们通过内存地址信息 , 看到是否真正的创建了一个新的实例对象 ;

package kim.hsl.design.prototype;/*** 原型模式实现流程 : 使用 clone 方法实现原型模式* 1 . 类继承 Cloneable 接口* 2 . 实现 protected Object clone() 方法*/
public class Student implements Cloneable {private String name;private int age;public Student() {System.out.println("调用 Student 默认构造函数");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {System.out.println("调用 Student clone 方法");return super.clone();}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", " + super.toString() +'}';}
}

3 . 使用原型模式创建实例测试代码 :

① 创建一个原型对象 : 首先使用构造函数 , 创建一个原型对象 newStudent , 之后的对象都是根据该原型对象 clone 创建的 ;

② 使用原型模式创建对象 : 循环中 , 通过调用原型对象 newStudent 的 clone() 方法 , 创建一个新的对象 ;

③ 性能分析 : 使用 clone 方法创建对象 , 比直接使用 new 构造函数方法开销更小 , 性能更高 , 如果要创建大量该对象示例 , 建议使用原型模式 , 使用 clone() 方法大量创建该对象 ;

package kim.hsl.design.prototype;public class Main {public static void main(String[] args) {try {//测试使用 clone 方法实现的原型模式 , 使用原型模式创建 10 个对象Student newStudent = new Student();/*需求声明 : 此时要创建 10 个 Student 对象依次调用一个创建好的 Student 对象的 clone 方法 10 次即可创建 10 个不同的对象适用场景 : 这是频繁创建大量的对象 , 该场景下适合使用原型模式*/for (int i = 0; i < 10; i++) {// 1 . 使用 clone 方法创建对象Student student = (Student) newStudent.clone();// 2 . 设置克隆出的对象参数student.setName("Tom" + i);student.setAge(10 + i);System.out.println(student);}} catch (CloneNotSupportedException e) {//捕获 clone 方法可能产生的异常e.printStackTrace();}}
}

4 . 执行结果 : 通过打印出的字符串序列分析 , 注意每个对象的地址 Student@1b6d3586 , Student@4554617c … , 10 个对象的地址都不相同 , 说明每个对象都是一个新的实例对象 ;

调用 Student 默认构造函数
Student clone 方法
注册学生信息 : Student{name='Tom0', age=10, kim.hsl.design.prototype.Student@1b6d3586}
Student clone 方法
注册学生信息 : Student{name='Tom1', age=11, kim.hsl.design.prototype.Student@4554617c}
Student clone 方法
注册学生信息 : Student{name='Tom2', age=12, kim.hsl.design.prototype.Student@74a14482}
Student clone 方法
注册学生信息 : Student{name='Tom3', age=13, kim.hsl.design.prototype.Student@1540e19d}
Student clone 方法
注册学生信息 : Student{name='Tom4', age=14, kim.hsl.design.prototype.Student@677327b6}
Student clone 方法
注册学生信息 : Student{name='Tom5', age=15, kim.hsl.design.prototype.Student@14ae5a5}
Student clone 方法
注册学生信息 : Student{name='Tom6', age=16, kim.hsl.design.prototype.Student@7f31245a}
Student clone 方法
注册学生信息 : Student{name='Tom7', age=17, kim.hsl.design.prototype.Student@6d6f6e28}
Student clone 方法
注册学生信息 : Student{name='Tom8', age=18, kim.hsl.design.prototype.Student@135fbaa4}
Student clone 方法
注册学生信息 : Student{name='Tom9', age=19, kim.hsl.design.prototype.Student@45ee12a7}

【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )相关推荐

  1. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  2. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  3. [设计模式] - 原型模式

    文章目录 一 .原型模式的简介 1. 什么是原型模式 2. 原型模式应用的业务场景 二.原型模式的实现 1. 原型模式的实现原理 2. 原型模式的简单实现 2.1 创建一个原型对象 2.2 测试原型对 ...

  4. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  5. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  6. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  7. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

  8. 04.设计模式-原型模式

    原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出 ...

  9. python:水果与设计模式-原型模式

    原型模式(Prototype Pattern):属于创建型模式,它提供了一种创建对象的最佳方式.这种模式实现了一个原型接口,该接口用于创建当前对象的克隆.当直接创建对象的代价比较大时,则采用这种模式. ...

最新文章

  1. python基础-字符串
  2. java 画布实验报告_编辑画布图像
  3. 飞鸽传书找不到其他人的问题
  4. 山东到底有没有互联网?
  5. NetofficeSystem协同办公系统今日发布
  6. TBB concurrent_set 没有erase
  7. python最小值最大化和最大值最小化_OJ 21658::Monthly Expense(二分搜索+最小化最大值)...
  8. radius服务器有什么协议,RADIUS服务器使用RADIUS协议完成对用户主机的认证、授权和计费时,RADIUS协议工作流程如下:...
  9. C++ 使用 OpenCV 实现证件照蓝底换成白底功能(或其他颜色如红色)详解
  10. 文件压缩算法详细分析(ZIP)及解压实例解释
  11. 将古典融汇到现代(一) ---皮尔斯逻辑之四
  12. P1234 小A的口头禅题解
  13. AI First:互联网进步的背后,反映出的是流量的再分配
  14. Python期末复习
  15. windows 配置域名
  16. C语言幻方矩阵的求解
  17. 数学建模笔记——评价类模型之熵权法
  18. regexp_substr
  19. 行人检测资源(下)代码数据
  20. python入门笔记之初步了解代码

热门文章

  1. 2018总结及2019计划
  2. 与善淘网一起做慈善商店
  3. 我总结的js性能优化的小知识
  4. qt-5.6.0 移植之纯净的linux文件系统的建立
  5. 打造完美的JS树形菜单
  6. NSURLConnection和NSRunLoop
  7. 在ubuntu下安装free pascal
  8. 【安装PHP】如何在openSUSE42.1下编译安装PHP7
  9. SpringMvc 事务的注解配置、实现、挂起
  10. [转] Firefox 24.0中的插件激活提示