原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
当有一个对象内部的构建细节非常复杂,而且我们还经常使用多个此类的实例对象,如果每次都需要充新去创建,那样也会很影响性能。
下面用一个例子介绍一下,我们需要制作份简历,每一份简历的构造过程都很相似,只是会有一些具体的地方需要修改(比如某一份简历是针对某一个公司的,一般不需要修改),这样我们就可以先创建一份简历,然后再使用这份简历复制出两份。这样省去了我们每次都创建简历实例的麻烦,也避免了我们犯错误,如果我们的简历有一个地方写错,我们如果使用土办法,创建三个实例,那么都得修改,如果我们使用原型模式,只需要把原型的错误修改了,其他的不用改变。
下面看一下代码:
package ResumeShallowCopy;
class Resume implements Cloneable{
private String name;
private String sex;
private int age;
public Resume(String name)
{
this.name = name;
}
public void SetPersonalInfo(String sex,int age)
{
this.sex = sex;
this.age = age;
}
public void Display()
{
System.out.println(name+" " + sex + " " + age);
}
public Object Clone()
{
try
{
return (Object)super.clone();
}
catch(Exception ex) {
return null;
}
}
}
package ResumeShallowCopy;
class Test {
public static void main(String[] args) {
Resume a = new Resume("A");
a.SetPersonalInfo("男", 30);//这里可以在构造函数中初始化
Resume b = (Resume)a.Clone();
Resume c = (Resume)a.Clone();
c.SetPersonalInfo("男", 24); //应该提供修改信息的方法
a.Display();
b.Display();
c.Display();
}
}
在这个例子中,只是提供了一种制作简历的方法,原型模式更加适用的如下的情况:
本来这里是一张类图图片,但是不着调为什么就是不能上传成功。图片内容是,有一个简历接口,有一个Clone方法,然后有一个普通简历类和一个视频简历类分别继承了这个接口。
这样我们可以创建不同的简历。
使用原型模式还应该注意一个问题,深复制和浅复制。如果我们在简历加上了一个工作经历,而这个工作经历使用另一个类的实例,这样如果浅复制的时候就会是同一个对象的引用,这样我们修改一个对象的工作经历时候,所有的对象的工作经历都会影响,这时候就应该使用深复制了。在使用原型模式一定要处理好这个问题,否则会产生意想不到的麻烦。