java设计模式Ctrl C和Ctrl V的原型模式详解
目录
- 记个笔记
- 原型模式定义
- 使用的编程客栈时机:
- 拷贝的区别
- 官方抽象的描述
- 好理解的人话
- 使用的步骤:
- 实现代码
- 原型模式的优缺点
- 几个注意事项
- 后记
记个笔记
早会,你拿着电脑在会议室里新建了一个记事本,用着搜狗输入法,疯狂的记录着你们部门老大的各种会议纪要。
时间很快,等散会的时候已经中午了,此时阿良才着急忙慌的赶到。看着他手足无措的样子,你淡定的对他说,不要急,会议内容都被你记录下来了,等会拷贝给他一份就好了。听完你的话,他忐忑的心才慢慢放下。
我们日常生活使用电脑时,经常会用到的一个操作,就是复制粘贴,即 Ctrl+C和Ctrl+V。但是javascript编程中,我们创建了一个对象,想在使用时拷贝出来一份该怎么办呢。这就是今天想提到的设计模式,原型模式。
原型模式定义
以目标对象为原型实例,通过复制的方式创建新对象。
其实换成人话就是:在内存里复制一个内容一模一样的新的对象。
使用的时机:
创建对象时,在构造函数中会进行大量的资源消耗操作。举几个比较夸张的例子:比如说可能进行网络申请或者说拷贝个几百m的数据到本地,再或者说要检编程客栈查下本地内存卡或者电脑硬盘上有多少个文件夹。这些都是很耗时的计算,但是这些都是在创建该对象之前的准备工作(举例而已,可能有点夸张)。此时可以使用原型模式,直接在内存中复制一个一模一样的对象。
拷贝的区别
官方抽象的描述
- 浅拷贝:基本数据类型互不干扰,两个引用数据类型引用,指向内存中同一个对象。
- 深拷贝:在内存中生成一个内容一模一样的引用数据对象。原型对象和生成对象互不干扰。
好理解的人话
- 浅拷贝:你在我的电脑中,创建了一个C盘的快捷方式。快捷方式和我的电脑中的C盘都能打开C盘文件夹。
- 深拷贝:你把你的会议时创建的记录会议的记事本,拷贝了一份给你的好友阿良。这两个记事本中的数据互不干扰。
使用的步骤:
1. 继承实现Clone接口
开发者_C培训2. 对象内部的基本数据类型变量,会直接拷贝。
3. 引用数据类型,可以根据需求。自行实现深拷贝或者浅拷贝(默认即浅拷贝,类比成快捷方式)
实现代码
/** * @author:Tia编程客栈nLong * @date:2022/10/18 19:47 * @detail:原型模式 具体实现类 */ class Book implements Cloneable{ public ArrayList<String> articles = new ArrayList<>(); public String author = ""; public int price = 0; public String publishers = ""; public Book(ArrayList<String> articles, String author, int price, String publishers) { this.articles = articles; this.author = author; this.price = price; this.publishers = publishers; } @Override public Book clone() { Book book = null; try { book = (Book) super.clone(); // 引用数据类型,需实现深拷贝 book.articles = (ArrayList<String>) this.articles.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } return book; } @Override public String toString() { return "Book{" + "articles=" + articles + ", author='" + author + '\'' + ", price=" + price + ", publishers='" + publishers + '\'' + '}'; } }
/** * @author:TianLong * @date:2022/10/18 19:52 * @detail:客户端 */ class Client { public static void main(String[] args) { ArrayList<String>arrayList=new ArrayList<>(); arrayList.add("丑小鸭"); arrayList.add("白雪公主"); arrayList.add("小红帽"); Book bookpython = new Book(arrayList,"安徒生",20,"人民出版社"); Book cloneBook = book.clone(); // 引用数据类型 book.articles.add("大闹天宫"); // 数据输出 System.out.println(book.toString()); System.out.println(cloneBook.toString()); } }
原型模式的优缺点
- 优点:在内存中以二进制流的方式直接拷贝对象数据。不需要new对象。
- 缺点:clone创建对象时,不会执行构造器函数。既是优点也是缺点。如需要实现某些放在构造器函数内的操作时,需要注意。
几个注意事项
- 原型模式,只要能达到复制对象目的即可,不一定需要实现clone接口。
- 实现clone接口后,调用对象的clone方法时,基本数据类型直接复制,引用数据类型只拷贝了对象引用。
- 若要实现引用数据类型的深拷贝,要么该引用数据类型自己内部实现了clone接口,要么直接new该对象,将原有数据添加到new出来的对象中。手动进行数据拷贝。
- clone接口复制时,参数内容以二进制流的方式在内存中直接复制,不执行对象的构造方法。
后记
原型模式就像是在Ctrl+C和Ctrl+V一样。可以帮我们快速的在内存中创建出一个对象。唯一要注意的是,拷贝出来的数据是 ”快捷方式“ ,还是一个 ”单独的文件“
以上就是Java设计模式 Ctrl C和Ctrl V---原型模式的详细内容,更多关于java设计模式 Ctrl C Ctrl V-的资料请关注我们其它相关文章!
精彩评论