设计模式 - 原型模式
一、引入
原型模式就像复制粘贴一样方便。你可以想象成在制作玩具时,用一个模具做出很多相同的玩具。在程序中,原型模式允许我们通过复制已有的对象来创建新的对象,而不需要从头开始写代码。
比如说,你有一个已经设置好的电子邮件模板,包括收件人、主题和内容。现在你需要发送类似的邮件给不同的人,但只需要修改收件人的名字。这时,你可以使用原型模式,复制原始邮件模板,然后只修改收件人的名字即可,省去了重新设置所有信息的麻烦。
原型模式的优点是节省了创建对象的时间和资源,同时保持了原始对象的状态不被修改。这种模式在需要创建多个相似对象时非常有用,特别是当对象的创建过程比较复杂时。
二、概念
原型模式(Prototype Pattern)是一种创建型设计模式,它允许对象在创建时通过复制一个现有对象的实例来进行创建,而不是通过传统的构造方法。
原型模式的核心思想是通过复制现有对象的状态来创建新的对象,从而避免了创建过程中的一些复杂初始化操作。这在某些情况下可以提升性能和节省资源。
三、基本结构
- 原型接口(Prototype) :定义了复制自身的方法,通常包含一个
clone()方法。 - 具体原型类(Concrete Prototype) :实现了原型接口,并实现了复制自身的方法。
- 客户端(Client) :使用原型对象的地方,通过复制现有的对象来创建新的对象。
四、示例代码
// 原型接口
interface Prototype {
Prototype clone();
}
// 具体原型类
class ConcretePrototype implements Prototype {
private int value;
public ConcretePrototype(int value) {
this.value = value;
}
@Override
public Prototype clone() {
return new ConcretePrototype(this.value);
}
public int getValue() {
return this.value;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 创建一个具体原型对象
ConcretePrototype prototype = new ConcretePrototype(10);
// 使用原型对象来创建新的对象
ConcretePrototype clone = (ConcretePrototype) prototype.clone();
// 输出新对象的值
System.out.println("Clone value: " + clone.getValue());
}
}
在上面的示例中,ConcretePrototype 实现了 Prototype 接口,并在 clone 方法中返回了一个新的实例,从而实现了复制自身的功能。
五、用途
-
节省资源和时间:
- 当一个对象的创建过程比复制一个已有对象的成本更高时,原型模式可以节省资源和时间,因为复制操作通常比初始化过程更快。
-
简化对象的创建:
- 原型模式可以避免一些复杂的初始化过程,特别是在对象的创建过程中涉及到大量的步骤或者配置项时,使用原型模式可以简化创建过程。
-
避免构造函数的复杂初始化:
- 有些对象的初始化过程可能非常复杂,包括大量的参数设置、依赖注入等操作,使用原型模式可以避免这些复杂的初始化过程。
-
保护对象状态:
- 原型模式可以保护对象的状态,因为每次创建新对象时都是从现有对象复制得到的,保证了原始对象的状态不会被修改。
-
支持动态配置:
- 原型模式可以在运行时动态地配置对象的状态,通过创建一个原型对象然后根据需要修改其状态,可以快速得到新的对象。
-
实现可定制的复制操作:
- 在原型模式中,复制操作可以被定制,可以选择深拷贝或浅拷贝,以满足不同的需求。
六、总结
原型模式适用于以下情况:
- 当一个对象的创建成本比复制一个已有对象的成本更高时。
- 当需要避免构造函数的复杂初始化过程时。
- 当一个类的实例只能有几个不同的状态组合,而且需要在运行时动态地创建新的实例。
关注公众号回复“设计模式源码”即可获取源码