解决的问题是:如何快速且精确地复制一个对象
GOF对于原型模式的定义是:“用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。”
所谓的原型模式,其实就是依托一个已经实例化的对象去创建另外一个可以进行定制的对象,而不需要知道创建过程中的具体细节。
public abstract class Prototype
{
private Stirng id;
//构造函数
public Prototype(String id)
{
this.id = id;
}
public String getId()
{
return id;
}
public abstract Prototype Clone();
}
public class ConcretePrototype1 extends Prototype
{
public ConcretePrototype1(String id)
{
super(id);
}
@override
public Prototype Clone()
{
try
{
return (Prototype)this.clone();
}
catch(CloneNotSupportedException e)
{
return null;
}
}
}
java提供了cloneable接口,只需要实现之就可以使用原型模式。
在初始化信息没有改变的情况下,克隆就是最好的进行实例化的方法,这样做不仅仅隐藏了对象创建的具体细节,也大大提高了运行的效率。
原型模式最本质的特点是,在不重新进行初始化对象的情况下,动态获取对象在运行时的状态。
线程安全
当对一个复杂对象进行操作时,从操作的开始一直到操作的结束,被操作的对象一般都会经历若干非法的中间状态,调用一个函数操作某个对象时,常常会使得该对象暂时陷入不可用的状态,等到操作完全结束时,该对象才会重新回到完全可用的状态。如果其他线程企图访问一个处于不可用状态的对象,该对象会发生不能正确响应的情况。
当对一个实例对象进行克隆时,如果恰巧是在多线程的情况下且该对象处于不稳定状态时,那么克隆可能就会失败甚至克隆出一个意料之外的对象。故而线程不安全。
一定要注意,要在对象处于稳定状态时对其进行克隆。
深复制和浅复制
浅复制: 被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都指向原来的对象。
深复制:要把复制的对象所有引用的对象都复制一遍。
int[] arrayB = arrayA; // × ×
int []arrayB = new int[4];
System.arraycopy(arrayA,0,arrayB,0,4);//√√
原型模式适用于以下几种情况:
- 当要实例化的类是在运行时刻指定时
- 为了避免创建一个与产品类层次平行的工厂类层次是
- 当一个类的实例只能有几个不同状态组合的一种时
网友评论