十、原型模式(Prototype)
1、介绍
原型模式是一种创建型设计模式,其主要目标是通过复制现有的实例来创建新的对象,而不是每次都从头开始用构造函数创建。它主要是为了解决在某些场景中,创建一个对象的成本比较高,或者系统需要创建大量相似的对象,并且希望能够快速高效地完成。
在某些情况下,例如,创建一个对象需要大量的I/O操作、需要对大量数据进行计算或者需要占用大量的系统资源等等,这时候,使用传统的构造函数来创建新对象可能会很慢,甚至可能会影响到系统的性能。原型模式可以通过复制现有的对象来避免这些开销。
另外,在某些系统中,可能需要创建大量相似或者状态相同的对象。如果每次都从头开始创建这些对象,那么可能会造成大量的代码重复,而且也可能会消耗大量的系统资源。原型模式可以通过复制一个原型对象来快速地创建新对象。
例如,在一款实时战略游戏中,可能需要在地图上创建大量相同的单位,例如坦克或者步兵。如果每次都从头开始创建这些单位,那么可能会消耗大量的CPU和内存资源。但是,如果有一个原型单位,那么可以通过复制这个原型单位来快速创建新的单位。
因此,原型模式在很多软件系统中都会出现,尤其是那些需要创建大量相似对象,或者对象创建开销大的系统中。
2、生活实例
想象一下,你正在举办一场大型聚会,你决定每位嘉宾都将收到一份完全相同的邀请函。那么,你会手写每一份邀请函吗?当然不会,这样做效率太低了。你会写一份邀请函,然后复印出足够的份额。这个过程就像是原型模式:创建了一个原型(你的原始邀请函),然后复制它,得到了许多完全一样的对象(复印出来的邀请函)。
3、java代码实例
在 Java 中,可以通过实现 Cloneable 接口和重写 clone 方法来实现原型模式。以下是一个简单的例子:
// 实现 Cloneable 接口
public class Prototype implements Cloneable {
private String field;
// 用于设置字段值
public void setField(String field) {
this.field = field;
}
// 用于获取字段值
public String getField() {
return field;
}
// 重写 clone 方法
@Override
public Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
// 创建一个原型实例
Prototype prototype = new Prototype();
prototype.setField("Hello, Prototype!");
// 通过原型复制出一个新的实例
Prototype cloned = prototype.clone();
// 打印原型和克隆实例的字段值,可以看到它们是相同的
System.out.println(prototype.getField());
System.out.println(cloned.getField());
}
}
这个例子中,Prototype 类实现了 Cloneable 接口,重写了 clone 方法,使得可以通过原型实例快速复制出新的实例。在 Client 类中,我们可以看到,通过原型 prototype 创建出的新实例 cloned,其字段值与原型是相同的。这就是原型模式的基本使用。
请注意,Java 的 clone 方法默认是浅拷贝,如果你的原型类中有复杂的对象结构,可能需要自行实现深拷贝。