介绍
原型模式通过复制创建复杂或构造耗时的实例。
主要解决:在运行期建立和删除原型的场景。
使用场景:
1.类初始化需要消耗较多的资源,这个资源包括数据、硬件资源。
2.通过new产生一个对象需要非常繁琐的数据准备或访问权限。
3.一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。
优点:
1.创建实例实例性能提高
2.逃避构造函数的约束,构造函数不执行
缺点:
1.减少约束是优点也是缺点。
2.必须实现Cloneable接口
浅拷贝和深拷贝
- 浅拷贝:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间。
所以浅拷贝的情况下,A引用B,修改A时B也会改变。即达不到保护性拷贝。 - 深拷贝:深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
UML类图
代码实现
Book.java
import java.util.ArrayList;
public class Book implements Cloneable {
private String article;
private ArrayList<String> images = new ArrayList<String>();
public Book() {
System.out.println("Book构造函数");
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public ArrayList<String> getImages() {
return images;
}
public void setImages(String image) {
images.add(image);
}
@Override
protected Book clone() {
try {
Book book = (Book)super.clone();
book.article = this.article;
//浅拷贝
//book.images = this.images;
//深拷贝
book.images = (ArrayList<String>)this.images.clone();
return book;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public void showBook() {
System.out.println("Book Start");
System.out.println("Article:" + article);
for(String image : images) {
System.out.println("Image Name:" + image);
}
System.out.println("Book End");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Book originBook = new Book();
originBook.setArticle("《今天你吃了吗》");
originBook.setImages("天空");
originBook.setImages("大地");
originBook.showBook();
Book copyBook = originBook.clone();
copyBook.showBook();
copyBook.setImages("湖泊");
copyBook.showBook();
originBook.showBook();
}
}
输出
Book构造函数
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Book End
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Book End
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Image Name:湖泊
Book End
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Book End