【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )
文章目录
- 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}
【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )相关推荐
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- [设计模式] - 原型模式
文章目录 一 .原型模式的简介 1. 什么是原型模式 2. 原型模式应用的业务场景 二.原型模式的实现 1. 原型模式的实现原理 2. 原型模式的简单实现 2.1 创建一个原型对象 2.2 测试原型对 ...
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...
- 设计模式 原型模式_设计模式:原型
设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- 04.设计模式-原型模式
原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出 ...
- python:水果与设计模式-原型模式
原型模式(Prototype Pattern):属于创建型模式,它提供了一种创建对象的最佳方式.这种模式实现了一个原型接口,该接口用于创建当前对象的克隆.当直接创建对象的代价比较大时,则采用这种模式. ...
最新文章
- python基础-字符串
- java 画布实验报告_编辑画布图像
- 飞鸽传书找不到其他人的问题
- 山东到底有没有互联网?
- NetofficeSystem协同办公系统今日发布
- TBB concurrent_set 没有erase
- python最小值最大化和最大值最小化_OJ 21658::Monthly Expense(二分搜索+最小化最大值)...
- radius服务器有什么协议,RADIUS服务器使用RADIUS协议完成对用户主机的认证、授权和计费时,RADIUS协议工作流程如下:...
- C++ 使用 OpenCV 实现证件照蓝底换成白底功能(或其他颜色如红色)详解
- 文件压缩算法详细分析(ZIP)及解压实例解释
- 将古典融汇到现代(一) ---皮尔斯逻辑之四
- P1234 小A的口头禅题解
- AI First:互联网进步的背后,反映出的是流量的再分配
- Python期末复习
- windows 配置域名
- C语言幻方矩阵的求解
- 数学建模笔记——评价类模型之熵权法
- regexp_substr
- 行人检测资源(下)代码数据
- python入门笔记之初步了解代码