原型模式
原型模式属于创建型模式的一种。它的核心思想是通过复制已经存在的对象来创建新的对象,而不是通过新建实例的过程。这种模式在需要创建大量相似对象或者创建对象成本较高(比如涉及复杂初始化、数据库查询等)的场景下非常有用。
定义
原型模式定义了对象的创建方式,通过给出一个原型实例来指明新创建的对象的类型,并且通过复制这个原型来创建新的对象。这种方式可以让新对象继承原型对象的属性和行为,从而减少对象创建过程中的复杂性。
类图
主要角色
抽象原型(Prototype):这是一个接口或者抽象类,声明了克隆自身的方法,通常是一个名为
clone()
的方法。具体原型(Concrete Prototype):实现抽象原型的类,需要实现
clone()
方法以提供对象的深拷贝或浅拷贝功能。具体原型类包含了对象状态的详细信息。
工作原理
客户端请求创建一个新对象时,不是直接使用
new
操作符创建,而是向已经存在的原型对象请求一个克隆。原型对象接收到请求后,通过自身的克隆方法创建并返回一个新的对象给客户端。这个新对象与原型对象具有相同的初始状态,但根据需要可以独立修改而不影响原型对象。
根据实现的不同,克隆可以是浅拷贝或深拷贝。
浅拷贝只复制对象的基本数据类型成员变量,而引用类型成员变量仍然指向原来的对象;
深拷贝则会递归复制所有层级的成员变量,使得原型和克隆对象完全独立。
- 重写clone()
- 通过序列化
优点
- 提高效率:对于复杂的对象创建,可以通过克隆已有对象来快速生成新对象,减少了系统开销。
- 简化创建过程:客户端不需要了解对象创建的具体步骤,只需知道如何使用原型对象即可。
- 易于扩展:通过增加新的具体原型类,可以轻松支持更多类型的对象创建。
缺点
- 配置管理复杂:如果原型类的属性很多,为了支持深拷贝,需要正确实现所有引用类型的复制逻辑。
- 违反单一职责原则:如果原型类还需要负责克隆逻辑,可能使其变得复杂,不再仅关注自身的业务逻辑。
适用场景
- 当创建新对象的成本较大时(如初始化需要复杂计算或数据库查询)。
- 需要创建的对象之间差异不大,可以通过修改已有对象的少量属性来获得新对象。
- 需要避免使用构造函数的硬编码来实例化对象,以提供更加灵活的对象创建方式。
实现示例(Java)
在Java中,可以通过实现 Cloneable
接口并重写 clone()
方法来实现原型模式。注意,Java中的 clone()
方法默认是浅拷贝,需要手动处理深拷贝逻辑。
java
public interface Prototype extends Cloneable {
Prototype clone() throws CloneNotSupportedException;
}
public class ConcretePrototype implements Prototype {
private String attribute;
public ConcretePrototype(String attribute) {
this.attribute = attribute;
}
@Override
public Prototype clone() throws CloneNotSupportedException {
// 实现深拷贝,如果有引用类型成员,需手动处理
return (ConcretePrototype) super.clone();
}
}
客户端代码示例:
java
ConcretePrototype original = new ConcretePrototype("Original Value");
ConcretePrototype cloned = original.clone(); // 通过克隆得到新对象