原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有对象来创建新对象,而无需再经过实例化和初始化的过程。原型模式通过克隆(Clone)操作来创建对象的副本,使得对象的创建更加高效和灵活。
核心思想:
定义一个抽象原型(Prototype)接口,其中包含一个克隆方法(Clone),用于复制对象。
具体原型类实现抽象原型接口,实现克隆方法来复制自身。
客户端通过调用原型对象的克隆方法来创建新的对象副本。
原型模式可以分为深拷贝和浅拷贝两种:
深拷贝:复制对象及其所有关联对象,即使关联对象也进行递归复制。
浅拷贝:仅复制对象本身,不复制关联对象,关联对象仍然是原对象和新对象共享的。
示例:
假设我们有一个原型类Book,用于表示图书的基本信息,我们可以通过原型模式来创建新的图书对象。
// 原型接口:图书
interface BookPrototype {
BookPrototype clone();
void showInfo();
}
// 具体原型类:图书
class Book implements BookPrototype {
private String title;
private String author;
private int pageCount;
public Book(String title, String author, int pageCount) {
this.title = title;
this.author = author;
this.pageCount = pageCount;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
@Override
public BookPrototype clone() {
return new Book(title, author, pageCount);
}
@Override
public void showInfo() {
System.out.println("《" + title + "》 by " + author + ", " + pageCount + " pages.");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建原型对象
BookPrototype prototype = new Book("Design Patterns", "Erich Gamma", 395);
// 克隆对象
BookPrototype book1 = prototype.clone();
BookPrototype book2 = prototype.clone();
// 修改克隆对象的信息
((Book) book1).setPageCount(300);
((Book) book2).setAuthor("Richard Helm");
// 显示图书信息
prototype.showInfo(); // 输出:《Design Patterns》 by Erich Gamma, 395 pages.
book1.showInfo(); // 输出:《Design Patterns》 by Erich Gamma, 300 pages.
book2.showInfo(); // 输出:《Design Patterns》 by Richard Helm, 395 pages.
}
}