原型模式
还记得单例模式中的ModelMapper吗?对“对象”的属性进行拷贝,原型模式的作用是什么?就是在于复制原型对象。以系统中已存在的一个对象为原型,直接基于内存二进制流进行复制,不需要再经历耗时的对象初始化过程(不调用构造函数),性能会提升很多。
经常我们会写很多get,set方法,我们通常会用lombok来帮我们进行简化。但是如果两个对象直接的属性赋值呢?很多人都会做xx.set(yy.get())的操作。
拿用户类举例:
package com.design.prototype;
public class User implements Cloneable {
@Override
protected User clone() {
try {
return (User) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这里是通过二进制流赋值,重新分配一个内存块,效率高。但是如果存在引用对象属性,则会指向同一对象的引用。
import lombok.Data;
import java.util.List;
@Data
public class User implements Cloneable {
@Override
protected User clone() {
try {
return (User) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
private String username;
private String password;
private List<String> roles;
}
通过使用序列化的方式使用深度拷贝
import lombok.Data;
import java.io.*;
import java.util.List;
@Data
public class User implements Cloneable, Serializable {
@Override
protected User clone() {
try {
return (User) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public User deepClone() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (User)ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
private String username;
private String password;
private List<String> roles;
}
如果是单例模式也会被原型模式破坏,所以单例模式肯定不能实现拷贝功能。
就目前开发环境来说,用的并不多,大部分人会选择MapStruct或者ModelMapper等