Prototype(原型模式)
原型(Prototype)模式的定义如下:
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节
模式的结构
原型模式包含以下主要角色。
- 抽象原型类:规定了具体原型对象必须实现的接口
- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象
- 访问类:使用具体原型类中的 clone() 方法来复制新的对象
//具体原型类
class Realizetype implements Cloneable
{
Realizetype()
{
System.out.println("具体原型创建成功!");
}
public Object clone() throws CloneNotSupportedException
{
System.out.println("具体原型复制成功!");
return (Realizetype)super.clone();
}
}
//原型模式的测试类
public class PrototypeTest
{
public static void main(String[] args)throws CloneNotSupportedException
{
Realizetype obj1=new Realizetype();
Realizetype obj2=(Realizetype)obj1.clone();
System.out.println("obj1==obj2?"+(obj1==obj2));
}
}
具体原型创建成功!
具体原型复制成功!
obj1==obj2?false
原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,但所克隆的类中出现了除int、string、等基本对象外的自定义对象时,即其他类的对象最为本类属性,此属性对象无法被真实克隆,用的是原型对象中此属性对象的引用。
深克隆:
这里随便截取了个例子来看,loc对象是person类的属性,在person类中重写clone方法在浅克隆基础上增加了对loc对象的浅克隆——浅克隆套浅克隆 =深克隆。前提是location类中没有对其他对象属性。