目录
一、为什么要用原型模式
二、模式定义
原型模式(Prototype Pattern):原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。
- 在面向对象系统中,使用原型模式来复制一个对象自身, 从而克隆出多个与原型对象一模一样的对象。
- 在软件系统中,有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在。
原型模式的基本工作原理是通过将一个原型对象传给那
个要发动创建的对象,这个要发动创建的对象通过请求
原型对象拷贝原型自己来实现创建过程。
三、模式结构
原型模式包含如下角色:
•
Prototype
:抽象原型类
•
ConcretePrototype
:具体原型类
•
Client
:客户类
四、模式分析
在原型模式结构中定义了一个抽象原型类,所有的
Java
类都继承
自
java.lang.Object
,而
Object
类提供一个
clone()
方法
,可以将
一个
Java
对象复制一份。因此在
Java
中可以直接使用
Object
的
clone()
方法来实现对象的克隆,
Java
语言中的原型模式实现很
简单。
能够实现克隆的
Java
类必须
实现一个标识接口
Cloneable
,表示
这个
Java
类支持复制。如果一个类没有实现这个接口但是调用了
clone()
方法,
Java
编译器将抛出一个
CloneNotSupportedException
异常。
五、实例代码
public class PrototypeDemo implements Cloneable
{
……
public Object clone()
{
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("Not support cloneable");
}
return object;
}
……
}
通常情况下,一个类包含一些成员对象,在使用原型模
式克隆对象时,
根据其成员对象是否也克隆,原型模式
可以分为两种形式:深克隆和浅克隆
。
六、模式优点
•
当创建新的对象实例较为复杂时,使用原型模式可以
简化对象的创建过程
,通过一个已有实例可以
提高新实例的创建效率
。
•
可以
动态增加或减少产品类
。
•
原型模式提供了
简化的创建结构
。
•
可以使用深克隆的方式
保存对象的状态
。
七、模式缺点
•
需要为每一个类配备一个克隆方法
,而且这个克隆方法需要对
类的功能进行通盘考虑,这对全新的类来说不是很难,但对已
有的类进行改造时,不一定是件容易的事,必须修改其源代码,
违背了“开闭原则”。
•
在
实现深克隆时需要编写较为复杂的代码
。
八、模式适用环境
•
创建新对象成本较大
,新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其属性稍作修改。
•
如果
系统要保存对象的状态
,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。相反,如果对象的状态变化很大,或者对象占用的内存很大,那么采用状态模式会比原型模式更好。
•
需要
避免使用分层次的工厂类来创建分层次的对象
,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。