原型模式(Prototype Pattern)
原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
调用者不需要知道任何创建细节,不调用构造函数。
属于创建型模式。
Prototype
抽象原型角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在Java中,通常实现了Cloneable接口。ConcretePrototype
具体原型角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。PrototypeManager
原型管理器角色(可选):创建具体原型类的对象,并记录每一个被创建的对象。ClientTest
客户角色:客户端类向原型管理器提出创建对象的请求。public interface Prototype extends Cloneable {
Prototype deepClone();
}
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;
import java.util.List;
@Data
public class ConcretePrototype implements Prototype{
private String name;
private int age;
private List skill;
public ConcretePrototype(){}
public ConcretePrototype(String name,int age,List skill){
this.age = age;
this.name = name;
this.skill = skill;
}
public Prototype deepClone(){
String jsonStr = JSONObject.toJSONString(this);
ConcretePrototype deepCopy = JSONObject.parseObject(jsonStr,ConcretePrototype.class);
return deepCopy;
}
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
public class PrototypeManager {
public static Prototype copy(ConcretePrototype concretePrototype){
return (Prototype) concretePrototype.clone();
}
public static Prototype deepCopy(ConcretePrototype concretePrototype){
return concretePrototype.deepClone();
}
}
public class ClientTest {
public static void main(String[] args) {
//ConcretePrototype 中的 List类型的属性 skill
List<String> skill = new ArrayList<String>(Arrays.asList("cook","code","run"));
//创建一个ConcretePrototype对象
ConcretePrototype concretePrototype = new ConcretePrototype("Tomas",40,skill);
System.out.println("concretePrototype:"+concretePrototype);
//浅克隆
Prototype shallowCopy = PrototypeManager.copy(concretePrototype);
//深克隆
Prototype deepCopy = PrototypeManager.deepCopy(concretePrototype);
//改变 skill内容,增加一项 dream
skill.add(3,"dream");
System.out.println("after add 'dream'");
System.out.println("shallowCopy:"+shallowCopy);
System.out.println("deepCopy:"+deepCopy);
}
}
输出结果为:
concretePrototype:ConcretePrototype(name=Tomas, age=40, skill=[cook, code, run])
after add 'dream'
shallowCopy:ConcretePrototype(name=Tomas, age=40, skill=[cook, code, run, dream])
deepCopy:ConcretePrototype(name=Tomas, age=40, skill=[cook, code, run])
从结果可以看出,原对象中的引用变量内容改变,对浅克隆对象有影响;对深克隆对象无影响。
以上就是原型模式全部内容,感谢阅读!