原型模式
原型模式(克隆模式、Clone模式)属于创建型模式的一种。
原型模式的本质是拷贝原型来创建新的对象,需要批量创建新对象且都是同一个类的对象的时候可以考虑使用原型模式。我们在日常开发中使用的 BeanUtils.copyProperties(),就是原型模式的一种用法。说到拷贝,就要说到深拷贝、浅拷贝,在之前的一篇文章中有所阐述 InheritableThreadLocal 父子线程值传递。
Java Object类中的clone()方法,它的意图就是复制一个新的对象出来,我们使用时,需要实现Cloneable接口来标识一个对象是“可复制”的。
原型模式通常有以下组成部分:
- 原型接口:定义一个方法用于复制自身,通常是一个 clone 方法。
- 具体原型:实现原型接口,重写 clone 方法,返回自身的一个副本。
- 客户端:使用原型对象,通过调用 clone 方法来创建新的对象。
使用原型模式来克隆一个 Book 对象。
1、原型接口
// 原型接口
interface Prototype {
Prototype clone();
}
2、具体原型
// 具体原型
class Book implements Prototype {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
@Override
public Prototype clone() {
return new Book(this.title, this.author);
}
@Override
public String toString() {
return "Book [title=" + title + ", author=" + author + "]";
}
}
3、客户端
// 客户端
public class Main {
public static void main(String[] args) {
// 创建原型对象
Book originalBook = new Book("Java Programming", "John Doe");
System.out.println("Original: " + originalBook);
// 克隆原型对象
Book clonedBook = (Book) originalBook.clone();
System.out.println("Cloned: " + clonedBook);
// 修改克隆对象
clonedBook = new Book("Python Programming", "Jane Doe");
System.out.println("After modification, Cloned: " + clonedBook);
System.out.println("Original remains unchanged: " + originalBook);
}
}
原型模式的优缺点。
优点:
- 性能优化:通过复制现有对象,减少了对象创建的时间开销,尤其是在对象创建过程复杂时。
- 降低耦合度:客户端无需了解如何具体构建对象,只需调用 clone 方法,简化了对象创建。
- 灵活性:可以根据需要创建不同状态的新对象,而不影响原型对象的状态。
缺点:
- 深拷贝与浅拷贝的复杂性:如果对象中包含引用类型的属性,浅拷贝可能导致多个对象共享同一内存空间,修改其中一个对象会影响另一个对象。实现深拷贝(即复制所有引用类型的对象),这会增加实现的复杂性。
- 增加了类的复杂性:每个需要克隆的类需实现 clone 方法,增加了代码的复杂性和维护难度。如果类层次结构复杂,管理克隆的实现会变得更为复杂。
- 性能开销:当对象非常复杂且包含大量数据时,克隆对象的开销可能会比直接创建新对象更高。
当对象的构造较为复杂,且可以通过复制现有实例来创建新对象时,可以使用原型模式。
抽象工厂、 生成器和原型都可以用单例模式来实现。
创建型模式过了一遍了,接下来我们要开始结构型模式了。
一以贯之的努力,不得懈怠的人生。-- 烟沙九洲