五分钟 掌握 原型模式

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 中使用原型模式来创建新的对象实例。在实际开发中,我们可以使用原型模式来实现对象的复用,从而提高程序的性能。

后端开发标签