Java中的原型设计模式

原型设计模式是创建型设计模式之一,因此它提供了对象创建的机制。

原型设计模式

当对象的创建是一个昂贵的事情,并且需要大量的时间和资源,而且您已经有一个类似的对象存在时,就可以使用原型设计模式。原型模式提供了一种机制,将原始对象复制到一个新对象,然后根据我们的需求进行修改。原型设计模式使用Java克隆来复制对象。

原型设计模式示例

很容易通过一个例子来理解原型设计模式。假设我们有一个从数据库加载数据的对象。现在我们需要在程序中多次修改这些数据,所以使用new关键字创建对象并再次从数据库加载所有数据不是一个好主意。更好的方法是将现有对象克隆到一个新对象中,然后进行数据操作。原型设计模式要求被复制的对象应提供复制功能。这不应由任何其他类完成。然而,是否使用对象属性的浅复制或深复制取决于需求,这是一个设计决策。以下是一个展示Java中原型设计模式示例的样例程序。Employees.java

package com.journaldev.design.prototype;

import java.util.ArrayList;
import java.util.List;

public class Employees implements Cloneable{

	private List empList;
	
	public Employees(){
		empList = new ArrayList();
	}
	
	public Employees(List list){
		this.empList=list;
	}
	public void loadData(){
		// 从数据库中读取所有员工并放入列表
		empList.add("Pankaj");
		empList.add("Raj");
		empList.add("David");
		empList.add("Lisa");
	}
	
	public List getEmpList() {
		return empList;
	}

	@Override
	public Object clone() throws CloneNotSupportedException{
			List temp = new ArrayList();
			for(String s : this.getEmpList()){
				temp.add(s);
			}
			return new Employees(temp);
	}
	
}

请注意,clone方法被重写以提供员工列表的深复制。下面是原型设计模式示例测试程序,它将展示原型模式的好处。PrototypePatternTest.java

package com.journaldev.design.test;

import java.util.List;

import com.journaldev.design.prototype.Employees;

public class PrototypePatternTest {

	public static void main(String[] args) throws CloneNotSupportedException {
		Employees emps = new Employees();
		emps.loadData();
		
		// 使用克隆方法获取员工对象
		Employees empsNew = (Employees) emps.clone();
		Employees empsNew1 = (Employees) emps.clone();
		List list = empsNew.getEmpList();
		list.add("John");
		List list1 = empsNew1.getEmpList();
		list1.remove("Pankaj");
		
		System.out.println("emps List: "+emps.getEmpList());
		System.out.println("empsNew List: "+list);
		System.out.println("empsNew1 List: "+list1);
	}

}

上述原型设计模式示例程序的输出是:

emps List: [Pankaj, Raj, David, Lisa]
empsNew List: [Pankaj, Raj, David, Lisa, John]
empsNew1 List: [Raj, David, Lisa]

如果没有提供对象克隆,我们将不得不每次都进行数据库调用来获取员工列表。然后进行可能是耗费资源和时间的操作。这就是关于Java中原型设计模式的全部内容。

Source:
https://www.digitalocean.com/community/tutorials/prototype-design-pattern-in-java