原型模式(Prototype)模式定义? 应用场景是啥? 有几种模式?分别示例
原型模式定义:
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已存在的对象来创建新对象,而不是通过新建类的方式。这种模式是在需要创建对象的结构和类型与现有对象相似的情况下使用的。原型模式通常涉及实现一个可以克隆自身的接口,这样对象就可以在不知道具体类型的情况下生成自己的复制品。
应用场景:
- 当创建一个对象的成本比复制一个对象的成本更高时:例如,当一个对象的初始化需要消耗较多的资源,如数据流的读取、硬件交互、网络请求等。
- 当系统需要独立于其产品创建、组合和表示方式时:原型模式允许客户端在不知道对象具体类型的情况下工作。
- 当需要实例化的类是在运行时指定时:例如,通过动态加载或应用某些配置来实例化类。
- 为了避免创建与产品类层次平行的工厂类层次时:原型模式可以使用原型管理器来存储一个类的所有可能状态的原型。
- 当一个类的实例只有少数不同状态组合中的一种时:安装相应数量的原型并克隆它们可能比每次用合适的状态手动实例化该类更方便。
原型模式的实现:
在很多语言中,原型模式可以通过实现一个克隆方法来完成。以下是使用Java语言的示例:
// 声明一个克隆自身的接口
public interface Prototype {
Prototype clone();
}
// 具体的原型类
class ConcretePrototype implements Prototype {
private String field;
public ConcretePrototype(String field) {
this.field = field;
}
// 实现克隆方法
@Override
public Prototype clone() {
return new ConcretePrototype(this.field);
}
public String getField() {
return field;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建一个原型对象
ConcretePrototype original = new ConcretePrototype("value");
// 克隆原型对象
ConcretePrototype cloned = (ConcretePrototype) original.clone();
// 输出克隆对象的字段值,验证它与原型对象相同
System.out.println(cloned.getField());
}
}
在这个例子中,ConcretePrototype
类实现了 Prototype
接口,并实现了 clone
方法。客户端可以通过调用 clone
方法来获取新的 ConcretePrototype
对象,而无需知道对象的具体类型。
注意事项:
- 在实现原型模式时,确保克隆操作考虑到对象内部的深复制和浅复制问题。深复制意味着所有对象的嵌套对象都被复制,而浅复制则可能只复制引用。
- 如果对象的构造过程包含与外部系统的交互,那么复制可能会违反系统的设计原则,这时应当重新考虑是否使用原型模式。
- 在一些语言中,如Java,原型模式可以通过实现
Cloneable
接口和重写clone()
方法来实现。但是clone()
方法默认是浅复制,如果需要深复制,需要手动实现。