【设计模式系列】原型模式

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

我是小黑,一个在互联网“苟且”的程序员。

流水不争先,贵在滔滔不绝

前言

原型设计模式是创建型设计模式之一,主要用于提供一种创建对象的机制。

其他创建型设计模式扩展阅读:

当一个对象的创建工厂很复杂,需要大量的时间和资源,每创建一次对象变得很昂贵,并且在已经有一个类似的对象时,就可以使用原型设计模式,来降低对象创建的成本,节约资源。

原型模式提供了一种机制,可以将原始对象复制到新对象中,然后根据需要对其进行修改。java中的原型设计模式使用clone()来复制对象。

场景

举个例子可能更容易理解原型设计模式,比如我们有一个对象是从数据库中加载出来的资源对象,现在需要在应用程序中多次对这个对象进行修改或使用。因此每次从数据库中重新加载这个对象或者使用new关键字重新创建不是一个好的处理方式。

更好的方法是将现有对象克隆为新对象,然后进行数据操作。

原型设计模式要求要被复制的对象必须提供可复制的特性。而其他任何类的对象都不应该提供可被复制的特性。在克隆对象时,使用对象属性的浅拷贝还是深拷贝取决于场景的需求和具体设计。

原型设计模式代码结构

下面是一个使用原型设计模式的代码示例:

package com.heiz.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(){
		//模拟从数据库中加载数据
		empList.add("小黑说Java");
		empList.add("小黑说Python");
		empList.add("小黑说JavaScript");
		empList.add("小黑说PHP");
	}
	
	public List<String> getEmpList() {
		return empList;
	}
	
    // clone方法用于对象的复制
	@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的深拷贝。

接下来我看使用一个简单测试代码看看如何使用原型设计模式:

package com.heiz.design.test;

import java.util.List;
import com.heiz.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<String> list = empsNew.getEmpList();
		list.add("小黑说HTML");
		List<String> list1 = empsNew1.getEmpList();
		list1.remove("小黑说Go");
		
		System.out.println("emps List: "+emps.getEmpList());
		System.out.println("empsNew List: "+list);
		System.out.println("empsNew1 List: "+list1);
	}
}

复制代码

以上就是原型设计模式的所有内容,如果对你有所帮助,点赞是对我最大的鼓励!

Guess you like

Origin juejin.im/post/7032836356774887438