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();
		
		//使用clone方法獲取Employee對象
		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