我们都知道多利羊吧,世界上第一个克隆生物。自从有了克隆羊的出现之后,我们对克隆的认识更加深刻。其实原型模式就是通过复制现有的实例来创建新的实例。而且在Java中,原型模式更加体现了克隆的思想。通过使用clone()方法,复制现有实例来创建新的实例。客户可以不知道现有实例是何种类的实例的情况下,制造出新的实例。
1.适用性和优缺点
1.适用性
a.当一个系统应该独立于它的产品创建、构成和表示时。
b.当要实例化的类是在运行时刻指定时,例如,通过动态加载。
c.为了避免创建一个与产品类层次平行的工厂类层次时。
d.当一个类的实例只能有几个不同状态组合中的一种时。
建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便些。
2.优点
a.向客户影藏制造新实例的复杂性。
b.提供让客户能够产生未知类型对象的选项。
c.在某些环境下,复制对象比创建新对象更有效。尤其是需要建立多个数目的实例时并且类内部比较复杂。
3.缺点
对象的复制有时相当麻烦。
2.示例讲解
今天就通过讲解一个实例的克隆示例。
UML图
prototype:一个父类,为具体类统一接口,该接口实现Cloneable接口。
concretePrototype:具体克隆类。
prototype类,实现了Cloneable接口,实现了clone方法:
package prototypepattern;
public class Prototype implements Cloneable {
private String name;
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public Object clone()
{
try{
return super.clone();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
具体子类,继承protype类,继承父类所有方法属性。
package prototypepattern;
public class ConcretePrototype extends Prototype {
public ConcretePrototype(String name)
{
setName(name);
}
}
测试程序
package prototypepattern;
public class Test {
public static void main(String[] args)
{
Prototype pro=new ConcretePrototype("prototype");
Prototype pro2=(Prototype)pro.clone();
System.out.println(pro==pro2);
System.out.println(pro.getName());
System.out.println(pro2.getName());
}
}
首先创建一个实例对象,然后通过克隆手段复制得到相同的实例。从结果可以看出两者名字一致,但是比较两者对象时,输出false,说明系统为这两个实例对象都分配了内存,是两个对象,与单例模式的那种相同实例不是相同概念。但是这符合克隆的思想。