原型模式
原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过new关键字实例化。这种模式特别适用于创建成本较高的对象,或是需要动态配置的对象。
角色组成
- Prototype(抽象原型类):声明克隆方法的接口
- ConcretePrototype(具体原型类):实现克隆方法
- Client(客户端):通过请求原型对象克隆自身来创建新对象
常用示例
// 1. 实现Cloneable接口
public class PrototypeDemo implements Cloneable {
private String field;
public PrototypeDemo(String field) {
this.field = field;
}
// 2. 重写clone方法
@Override
public PrototypeDemo clone() {
try {
return (PrototypeDemo) super.clone(); // 浅拷贝
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // Cloneable已实现,不会发生
}
}
// 3. 使用示例
public static void main(String[] args) {
PrototypeDemo original = new PrototypeDemo("original");
PrototypeDemo copy = original.clone();
}
}
优缺点
优点
- 性能提升:避免重复初始化过程(如数据库连接)
- 动态配置:克隆后修改比重新构造更方便
- 简化创建:隐藏对象创建细节
- 快速复制:适合需要对象副本的场景
缺点
- 深拷贝实现复杂:特别是对象引用关系复杂时
- 克隆方法需重写:可能需要处理特殊逻辑
- 破坏封装性:某些语言中需要访问私有成员
适用场景
- 对象创建成本高(如需要复杂计算或IO操作)
- 需要大量相似对象(游戏中的小兵生成)
- 需要保存对象状态(撤销操作的历史记录)
Spring中的应用
Spring中的prototype作用域就是原型模式的典型应用
@Component
@Scope("prototype") // 每次获取都创建新实例
public class PrototypeBean {
// ...
}