原型模式
原型模式介绍
用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象,称为原型模式
原型模式是一个创建型模式,用户可以从一个样板对象中复制出一个内部属性一致的对象,这个过程就是"克隆"。被复制的对象实例就是"原型",这个原型是可以定制的。
原型模式应用场景
- 类初始化需要消耗非常多得资源,这个资源包括数据、硬件资源等,通过复制避免这些消耗。
- 通过new产生一个对象需要非常频繁的数据准备或访问权限。
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改属性时,用原型模式复制多个对象供调用者使用,可以起到保护作用。
原型模式的实现
cloneable 相当于类图中的prototype,该接口声明这个类是可以复制的,重写的clone方法是Object的clone方法
wordDocument 相当于类图中的ConcretePrototype
package Prototype;
import java.util.ArrayList;
import java.util.List;
public class WordDocument implements Cloneable {
//文本
private String mText;
//图片列表
private ArrayList<String> mImages = new ArrayList<>();
public WordDocument(){
System.out.println("-------WordDocument 构造方法--------");
}
@Override
protected WordDocument clone() {
try {
WordDocument doc = (WordDocument) super.clone();
doc.mText = this.mText;
doc.mImages = this.mImages;
return doc;
}catch(Exception e){
e.printstacktrace();
return null;
}
}
public String getText(){
return mText;
}
public void setText(String mText){
this.mText = mText;
}
public List<String> getImages(){
return mImages;
}
public void addImages(String image){
this.mImages.add(image);
}
public void showWordDocument(){
System.out.println("------Word context Start------");
System.out.println("Text:"+mText);
System.out.println("Images List:");
for (String image:mImages) {
System.out.println("images name:"+image);
}
System.out.println("------Word Context End------");
}
}
客户端进行调用
package Prototype;
public class Client {
public static void main(String[] args){
//构建文档对象
WordDocument originDoc = new WordDocument();
originDoc.setText("这是Text_1的文档");
originDoc.addImages("图片一");
originDoc.addImages("图片二");
originDoc.addImages("图片三");
originDoc.showWordDocument();
System.out.println();
//克隆文档对象
WordDocument doc = originDoc.clone();
doc.showWordDocument();
System.out.println();
//修改克隆对象
doc.setText("这是text_2的文档");
doc.addImages("你看,这人好傻.jpg");
doc.showWordDocument();
System.out.println();
//重新显示被拷贝的文档
originDoc.showWordDocument();
}
}
这种方法被称为浅拷贝,只是拷贝后的对象引用被拷贝的对象,依旧是指向同一个地址,所以修改靠背后的属性,原来的属性也会被修改,上述测试代码执行过后的各对象内容
此时,就需要深拷贝,就是在拷贝对象时,对于引用型的字段也要采用拷贝的形式,而不是单纯的引用的形式。
对clone方法进行简单的修改即可。
此时就不会修改原来的对象属性了
相关阅读
谁也没想到,2019年第一个风口竟然来的如此高调。2019年1月,排名App Store榜首既不是微信、支付宝这些传统大牌,也不是抖音、拼多多这
修改bootable/bootloader/lk/app/aboot/aboot.c else if(reboot_mode == FASTBOOT_MODE) { //boot_into_fastboot = tru
工厂模式:此种模式是软件工程领域中的一个广为认知的设计模式,抽象了创建具体对象的过程,利用函数来封装以特定接口创建对象的细节。
部分PM在设计移动端产品的时候,往往是随意画了个原型尺寸或者上网找个模板套进去,当然也有部分知道用375×667比较好,但是不知其
本文主要参考资料:《设计模式之禅》 本文主要目录为:1)案例 2)适配器模式解决 3)适配器模式的定义 4)拓展 1. 案例 比如我们现在有