1. 简介
原型模式(Prototype Pattern)是 一种创建型设计模式,其主要目的是通过 复制已有的实例来创建新的实例。
在实际开发中,我们可能需要创建某些成本较高的对象,例如一些 数据库连接对象 或者 线程池,这些对象的创建可能需要耗费很多的时间和资源,所以我们可以使用原型模式来实现这些对象的复用,从而达到提升性能的目的。
2. 实现原型模式
2.1 创建原型接口
首先,我们需要创建一个原型接口,该接口将定义一个 克隆自身的方法。由于 Java 中所有的类都继承自 Object
,所以我们可以将该方法定义在 Object
中。
public class Object {
public Object clone() {
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
}
在这里,我们在 Object
中添加了一个 clone()
方法,该方法会调用 super.clone()
来创建并返回一个新的对象。我们将在后面的示例中详细解释该方法的作用。
2.2 创建具体原型类
接下来,我们需要创建一个 具体的原型类,该类将继承自原型接口,并实现其方法。
我们可以以简历的生成为例,创建一个 Resume
类,该类将包含一些关于个人信息和工作经历的属性,我们可以通过该类的实例来创建新的简历实例。
public class Resume implements Cloneable {
private String name;
private int age;
private List workExperience;
public Resume(String name, int age, List workExperience) {
this.name = name;
this.age = age;
this.workExperience = workExperience;
}
// 克隆自身
public Resume clone() {
Resume obj = null;
try {
obj = (Resume) super.clone();
obj.workExperience = new ArrayList(this.workExperience);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
// 获取姓名
public String getName() {
return name;
}
// 设置姓名
public void setName(String name) {
this.name = name;
}
// 获取年龄
public int getAge() {
return age;
}
// 设置年龄
public void setAge(int age) {
this.age = age;
}
// 获取工作经历
public List getWorkExperience() {
return workExperience;
}
// 添加工作经历
public void addWorkExperience(String work) {
workExperience.add(work);
}
}
在这里,我们定义了一个 Resume
类,该类实现了 Cloneable
接口,并重写了其 clone()
方法。
在 clone()
方法中,我们首先调用 super.clone()
来创建一个新的对象,并将该对象转型为 Resume
。接下来,我们需要将旧对象的工作经历列表复制到新对象中。
3. 使用原型模式
我们已经创建了原型接口和具体原型类,现在可以使用该类来创建新的简历实例了。
在下面的示例中,我们将创建一个原始的简历实例,并添加一些工作经历。接着,我们将使用该实例的 clone()
方法来创建多个新的实例,这些实例都包含与原始实例相同的属性和方法。
public class PrototypePatternDemo {
public static void main(String[] args) {
// 创建原始简历
Resume originalResume = new Resume("张三", 25, new ArrayList());
originalResume.addWorkExperience("2018/1/1-至今,某公司,Java 开发工程师");
originalResume.addWorkExperience("2016/7/1-2017/12/31,某公司,Web 前端开发工程师");
// 克隆多个简历
Resume resume1 = originalResume.clone();
Resume resume2 = originalResume.clone();
// 修改克隆后的简历
resume1.setName("李四");
resume1.setAge(30);
resume1.addWorkExperience("2015/5/1-2016/6/30,某公司,PHP 开发工程师");
resume2.setName("王五");
resume2.setAge(28);
resume2.addWorkExperience("2019/5/1-至今,某公司,Python 开发工程师");
// 打印所有简历的信息
System.out.println("原始简历:");
originalResume.display();
System.out.println("简历 1:");
resume1.display();
System.out.println("简历 2:");
resume2.display();
}
}
在示例中,我们首先创建了一个 Resume
实例,然后调用了其 addWorkExperience()
方法来添加一些工作经历。接着,我们分别使用该实例的 clone()
方法来创建两个新的实例,并调用这些实例的方法来修改其属性。
最后,我们分别调用了这些实例的 display()
方法来显示它们的信息。
4. 结果输出
运行上面的示例代码,我们将得到以下输出结果:
原始简历:
姓名:张三
年龄:25
工作经历:
2018/1/1-至今,某公司,Java 开发工程师
2016/7/1-2017/12/31,某公司,Web 前端开发工程师
简历 1:
姓名:李四
年龄:30
工作经历:
2018/1/1-至今,某公司,Java 开发工程师
2016/7/1-2017/12/31,某公司,Web 前端开发工程师
2015/5/1-2016/6/30,某公司,PHP 开发工程师
简历 2:
姓名:王五
年龄:28
工作经历:
2018/1/1-至今,某公司,Java 开发工程师
2016/7/1-2017/12/31,某公司,Web 前端开发工程师
2019/5/1-至今,某公司,Python 开发工程师
5. 总结
通过本文,我们学习了原型模式的实现和使用方式,并通过示例代码演示了如何在 Java 中使用原型模式来创建新的对象实例。在实际开发中,我们可以使用原型模式来实现对象的复用,从而提高程序的性能。