设计模式 5:原型模式
定义与目的
- 定义:原型模式通过复制现有的实例来创建新对象,而不是通过构造函数创建。
- 目的:这种模式的主要目的是为了提高创建对象的性能,特别是在创建对象的成本较高时。通过克隆现有的实例,可以避免构造函数中的初始化开销。
实现示例
假设我们有一个复杂的文档对象,创建这样一个对象可能涉及到大量的计算或数据库查询。我们可以使用原型模式来避免重复这些昂贵的操作。
import java.util.Date;
import java.util.List;
// 定义产品接口
public interface Document {
void print();
Document clone();
}
// 具体产品
public class ComplexDocument implements Document {
private String title;
private List<String> content;
private Date creationDate;
public ComplexDocument(String title, List<String> content, Date creationDate) {
this.title = title;
this.content = content;
this.creationDate = creationDate;
}
@Override
public void print() {
System.out.println("Title: " + title);
System.out.println("Creation Date: " + creationDate);
System.out.println("Content:");
for (String line : content) {
System.out.println(line);
}
}
@Override
public Document clone() {
try {
// 对于不可变对象(如String),使用浅拷贝是安全的
// 对于可变对象(如List<String>),使用深拷贝是安全的
ComplexDocument clonedDocument = (ComplexDocument) super.clone();
clonedDocument.content = new ArrayList<>(this.content); // 深拷贝
return clonedDocument;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
// Getters and Setters for demonstration purposes
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<String> getContent() {
return content;
}
public void setContent(List<String> content) {
this.content = content;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建原始文档
List<String> content = List.of("Introduction", "Chapter 1", "Conclusion");
Date creationDate = new Date();
Document originalDocument = new ComplexDocument("My Document", content, creationDate);
// 打印原始文档
originalDocument.print();
// 克隆文档
Document clonedDocument = originalDocument.clone();
// 修改克隆文档的标题
((ComplexDocument) clonedDocument).setTitle("Cloned Document");
// 打印克隆文档
clonedDocument.print();
}
}
使用场景
- 当创建新对象的成本较高时。
- 当你需要创建许多相似的对象,但又不想每次都执行完整的初始化过程时。
- 当你需要避免对象创建时的昂贵开销时。
原型模式通过复制现有的实例来创建新对象,这样可以节省时间和资源。它适用于那些初始化成本较高的对象,或者在需要创建大量相似对象时。
小结
原型模式是一种高效的对象创建方式,特别是在创建成本高的对象时。它通过克隆现有对象来创建新对象,从而减少了初始化的开销。