原型模式

定义

原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

有时候当你想复制一个对象时,先会想到用new,但有时候你拿到的只是抽象类,亦或者这个对象内部有一些私有属性你是拿不到的。
还有时候,如果对象没有实现clone方法来实现克隆,则这个时候通过clone获取的是浅克隆,如果里面有其他对象,则返回的是引用。

原型模式是一种另类的创建型模式,创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。

类图

角色

  • 客户(Client):客户类提出创建对象的请求。
  • 抽象原型(Prototype):这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口。
  • 具体原型(Concrete Prototype):被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

在进行克隆的时候,分为浅拷贝和深拷贝。我们的实际业务场景中大部分情况下需要深拷贝,深拷贝可以通过序列化或者直接new的方式实现。

优缺点

优点

  • 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。

缺点

  • 需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。

使用场景

  • Android中的Intent
1
2
3
4
5
6
7
8
public class Intent implements Parcelable, Cloneable {
...
@Override
public Object clone() {
return new Intent(this);
}
...
}

参考