设计模式-原型模式(译)

238 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

原型模式是一种创建型设计模式(creational design pattern),提供了一种对象创建机制

原型模式

原型模式通常用于对象创建开销很大,需要花很长的时间和资源,并且已经有一些相似对象存在 原型模式提供一种机制复制已有对象到一个新的对象中,然后根据需要进行修改。原型模式使用java种的克隆来复制对象

原型模式例子

用一个例子就可以很好的理解原型模式。假定我们有一个对象从数据库中加载数据。现在我们需要在程序中多次修改这些数据,因此通过new来创建这个对象,且再从库里把所有数据加载,就不是一个好方式了

更好的方式是我们可以从已有的对象clone一个新的对象,然后对数据进行变更

原型模式需要被复制对象提供一个copying的功能,这个功能不应该再其他类中完成。因此不管我们使用浅复制还是深复制对象属性,完全取决于设计需要

这儿有一个原型模式java示例程序。

Employees.java


package com.journaldev.design.prototype;

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

public class Employees implements Cloneable{

	private List<String> empList;
	
	public Employees(){
		empList = new ArrayList<String>();
	}
	
	public Employees(List<String> list){
		this.empList=list;
	}
	public void loadData(){
		//read all employees from database and put into the list
		empList.add("Pankaj");
		empList.add("Raj");
		empList.add("David");
		empList.add("Lisa");
	}
	
	public List<String> getEmpList() {
		return empList;
	}

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

可以看到clone方法被重写了,用来提供一个深拷贝employees列表

下面是一个原型模式的测试代码,可以看到使用原型模式的好处

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();
		
		//Use the clone method to get the Employee object
		Employees empsNew = (Employees) emps.clone();
		Employees empsNew1 = (Employees) emps.clone();
		List<String> list = empsNew.getEmpList();
		list.add("John");
		List<String> 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]

如果对象的clone方法没有提供,我们每一次都需要调用数据库来获取employees列表,然后做那些消耗资源和时间的操作

这就是java中的原型模式

原文链接