【设计模式-原型模式】
时间:2022-07-24
本文章向大家介绍【设计模式-原型模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有些场景中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效。
比如王者里面的小兵,只需创建一个小兵的原型,之后就只需要进行克隆复制就行了。
一、定义
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型类必须实现cloneable接口,实现clone方法。
二、实例
创建一个小兵的原型
public class BatmanPrototype implements Cloneable{
//横坐标
private double x;
//纵坐标
private double y;
//血量
private Blood blood;
//省略get/set方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
1、血量没有实现Cloneable方法
public class Blood{
private int blood;
}
测试类:
BatmanPrototype batmanPrototype = new BatmanPrototype();
batmanPrototype.setX(10d);
batmanPrototype.setY(10d);
batmanPrototype.setBlood(new Blood(100));
BatmanPrototype cloneObject = (BatmanPrototype) batmanPrototype.clone();
System.out.println("prototype:"+batmanPrototype);
System.out.println("clone:"+cloneObject);
1、修改原型血量
batmanPrototype.getBlood().setBlood(99);
System.out.println("=======================================");
System.out.println("prototype:"+batmanPrototype);
System.out.println("clone:"+cloneObject);
结果如下:
我在代码中只修改了原型的血量,但是从结果看,克隆出来的类的血量也被修改了,这就是浅克隆,只是简单的将地址赋值给了对象,只要原型一变,克隆对象也会改变。
概念:
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
那么如何使用深克隆呢?
这就需要重写原型的clone方法以及原型属性需要实现Cloneable接口。
public class BatmanPrototype implements Cloneable{
//横坐标
private double x;
//纵坐标
private double y;
//血量
private Blood blood;
@Override
protected Object clone() throws CloneNotSupportedException {
BatmanPrototype batmanPrototype = (BatmanPrototype) super.clone();
batmanPrototype.blood = (Blood) this.blood.clone();
return batmanPrototype;
}
}
public class Blood implements Cloneable{
private int blood;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
再用之前的测试类进行测试:
BatmanPrototype batmanPrototype = new BatmanPrototype();
batmanPrototype.setX(10d);
batmanPrototype.setY(10d);
batmanPrototype.setBlood(new Blood(100));
BatmanPrototype cloneObject = (BatmanPrototype) batmanPrototype.clone();
System.out.println("prototype:"+batmanPrototype);
System.out.println("clone:"+cloneObject);
1、修改原型血量
batmanPrototype.getBlood().setBlood(99);
System.out.println("=======================================");
System.out.println("prototype:"+batmanPrototype);
System.out.println("clone:"+cloneObject);
结果:
此时克隆对象的血量就不会随着原型变化而变化了。
三、源码实例
实现了Cloneable的接口都属于这种模式。
- Tomcat和Java Virtual Machine的性能调优总结
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
- 简单聊聊不可或缺的Nginx反向代理服务器--实现负载均衡【上篇】
- Java设计模式之适配器设计模式(项目升级案例)
- Java设计模式之模板方法设计模式(银行计息案例)
- 多线程之策略模式
- 文件上传的动作不能太俗,必须页面无刷新上传
- 这次真的忽略了一些ActiveMQ内心的娇艳
- 多线程编程:阻塞、并发队列的使用总结
- 多线程编程:多线程并发制单的开发记录【一】
- 如何使用线程锁来提高多线程并发效率
- 如何在分布式环境中同步solr索引库和缓存信息
- 如何在分布式环境中同步solr索引库和缓存信息
- Info模式下的隐形杀手(SpringMVC同时使用<mvc:resources.../>和FormattingConversionServiceFactoryBean时出现的问题)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从0到1,实现你的第一个多层神经网络
- 【Python】使用Pygame做一个Flappy bird小游戏(二)
- 【Pandas】pandas的主要数据结构
- 【Python】使用Pygame做一个Flappy bird小游戏(三)
- Godot游戏开发实践之三:容易被忽视的Resource
- 方便快捷的调试 Node.js 程序
- LeetCode 06Z字形变换&07整数反转
- 对搜索表单提交是否为空进行弹出提示
- PWN入门(Fastbin Attack)
- Qt项目网络聊天室设计
- nginx 端口转发
- linux通用链表
- 什么情况用ArrayList or LinkedList呢?
- Dubbo系列-扬帆起航
- 使用 Horoscope 测试 TiDB 优化器