原型模式
时间:2022-07-25
本文章向大家介绍原型模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原型模式是什么?
原型模式属于创建型模式,是用于创建重复的对象,同时又能保证性能。是一种创建对象的最佳方式。
原型模式可以干嘛?
原型模式是通过一个原来已存在的对象进行拷贝,然后生成一个新的对象。在日常开发过程中需要进行拷贝。就比如现在流行的病毒其实就是自己本身的一个拷贝,而不断繁衍的。
优点:
性能高:由于底层用二进制进行拷贝
绕开构造函数的约束
缺点:
必须实现Cloneable接口
类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: csh
* @Date: 2020/5/18 16:05
* @Description:病毒
*/
public class Virus implements Cloneable {
@Override
protected Virus clone() throws CloneNotSupportedException {
return (Virus)super.clone();
}
}
/**
* @Auther: csh
* @Date: 2020/5/18 16:05
* @Description:浅拷贝 病毒
*/
public class ShallowVirus implements Cloneable {
private List<String> list = new ArrayList <String>();
public List <String> getList() {
return list;
}
public void addName(String name){
list.add(name);
}
public void printNames(){
for (String name : list) {
System.out.println(name);
}
}
public void setList(List <String> list) {
this.list = list;
}
@Override
protected ShallowVirus clone() throws CloneNotSupportedException {
return (ShallowVirus)super.clone();
}
}
/**
* @Auther: csh
* @Date: 2020/5/18 16:05
* @Description:深拷贝 病毒
*
*
*/
public class DeepVirus implements Cloneable {
private List<String> list = new ArrayList <String>();
public List <String> getList() {
return list;
}
public void addName(String name){
list.add(name);
}
public void printNames(){
for (String name : list) {
System.out.println(name);
}
}
public void setList(List <String> list) {
this.list = list;
}
@Override
protected DeepVirus clone() throws CloneNotSupportedException {
try {
DeepVirus deepVirus = (DeepVirus)super.clone();
List<String> newList = new ArrayList <String>();
for (String val : this.getList()) {
newList.add(val);
}
//再把这个list复制到对象中
deepVirus.setList(newList);
return deepVirus;
}catch (Exception e){
System.out.println(e);
return null;
}
}
}
/**
* @Auther: csh
* @Date: 2020/5/18 16:07
* @Description:原型测试
* 浅克隆:被克隆对象的所有变量都含有与原来的对象相同的值,而它所有的对其他对象的引用都仍然指向原来的对象。换一种说法就是浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象。
*
* 深克隆:被克隆对象的所有变量都含有与原来的对象相同的值,但它所有的对其他对象的引用不再是原有的,而这是指向被复制过的新对象。换言之,深复制把要复制的对象的所有引用的对象都复制了一遍,这种叫做间接复制。
*
*/
public class Client {
public static void main(String[] args) {
try {
//拷贝
Virus copyVirus = new Virus();
System.out.println(copyVirus);
Virus clone = copyVirus.clone();
System.out.println(clone);
//浅拷贝
ShallowVirus virus = new ShallowVirus();
virus.addName("新冠状1");
System.out.println("原病毒"+virus);
ShallowVirus newVirus = virus.clone();
newVirus.addName("新冠状2");
System.out.println("新病毒"+newVirus);
virus.printNames();
System.out.println("----------");
newVirus.printNames();
//深拷贝
System.out.println("----------");
DeepVirus deepVirus = new DeepVirus();
deepVirus.addName("SAAS1");
DeepVirus deepVirus2 = deepVirus.clone();
deepVirus2.addName("SAAS2");
deepVirus.printNames();
System.out.println("---------------");
deepVirus2.printNames();
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后:
原型模式是非常简单的一种,但是需要特别注意,浅拷贝带来的坑,否则在日常开发过程中遇到的问题多了去了...
- 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 数组属性和方法
- 新浪微博IPAD客户端XSS(file域) + 构造Worm
- Firefox 31~34远程命令执行漏洞的分析
- emlog绕过验证码刷评论
- cmseasy最新注入+360webscan的绕过分析
- 新型任意文件读取漏洞的研究
- Chrome XSS Auditor Bypass Using SVG
- ngx_lua_waf针对性改写
- Wordpress < 4.1.2 存储型XSS分析与稳定POC
- 重构Sec-News之路
- ThinkPHP留后门技巧
- 『三个白帽』某题的writeup
- 创造tips的秘籍——PHP回调后门
- Joomla远程代码执行漏洞分析(总结)
- 那些年我拿下的demo站之方维O2O
- emlog自动备份插件泄露整站数据库备份漏洞