这是我参与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);
}
}
复制代码
以上就是原型设计模式的所有内容,如果对你有所帮助,点赞是对我最大的鼓励!