JAVA语言版原型模式(深拷贝与浅拷贝)
创建pojo类
public class PersonalInfo implements Serializable {
private String name;
private String sex;
private int age;
public PersonalInfo(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "PersonalInfo{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
public class WorkExperience implements Serializable {
private String timeArea;
private String company;
public WorkExperience(String timeArea, String company) {
this.timeArea = timeArea;
this.company = company;
}
public String getTimeArea() {
return timeArea;
}
public void setTimeArea(String timeArea) {
this.timeArea = timeArea;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public String toString() {
return "WorkExperience{" +
"timeArea='" + timeArea + '\'' +
", company='" + company + '\'' +
'}';
}
}
创建深拷贝的pojo与浅拷贝的pojo
public class ResumeDeep implements Cloneable, Serializable {
private String skill;
private PersonalInfo personalInfo;
private WorkExperience workExperience;
public ResumeDeep(String skill, PersonalInfo personalInfo, WorkExperience workExperience) {
this.skill = skill;
this.personalInfo = personalInfo;
this.workExperience = workExperience;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public PersonalInfo getPersonalInfo() {
return personalInfo;
}
public void setPersonalInfo(PersonalInfo personalInfo) {
this.personalInfo = personalInfo;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
public ResumeDeep clone() {
ResumeDeep resumeDeep = null;
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
resumeDeep = (ResumeDeep) objectInputStream.readObject();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
return resumeDeep;
}
public void Display() {
System.out.println("个人信息:"+personalInfo.getName()+" "
+personalInfo.getSex()+" "+personalInfo.getAge());
System.out.println("工作经历:"+workExperience.getTimeArea()
+" "+workExperience.getCompany());
System.out.println("技能:"+skill);
}
}
public class ResumeShallow implements Cloneable {
private String skill;
private PersonalInfo personalInfo;
private WorkExperience workExperience;
public ResumeShallow(String skill, PersonalInfo personalInfo, WorkExperience workExperience) {
this.skill = skill;
this.personalInfo = personalInfo;
this.workExperience = workExperience;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public PersonalInfo getPersonalInfo() {
return personalInfo;
}
public void setPersonalInfo(PersonalInfo personalInfo) {
this.personalInfo = personalInfo;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
public ResumeShallow clone() {
ResumeShallow resumeShallow = null;
try {
resumeShallow = (ResumeShallow) super.clone();
} catch (CloneNotSupportedException e) {
/* System.out.println(e.getMessage());*/
e.printStackTrace();
}
return resumeShallow;
}
public void Display() {
System.out.println("个人信息:"+personalInfo.getName()+" "
+personalInfo.getSex()+" "+personalInfo.getAge());
System.out.println("工作经历:"+workExperience.getTimeArea()
+" "+workExperience.getCompany());
System.out.println("技能:"+skill);
}
}
PrototypePatternDemo 演示原型模式
public class PrototypePatterDemo implements Serializable {
public static void main(String[] args) {
PersonalInfo personalInfoOne = new PersonalInfo("小明", "男", 20);
WorkExperience workExperienceOne = new WorkExperience("2010-2012", "xxx公司");
ResumeShallow resumeShallow = new ResumeShallow("游泳", personalInfoOne, workExperienceOne);
ResumeShallow resumeShallowCopy = resumeShallow.clone();
resumeShallowCopy.setSkill("跳高");
resumeShallowCopy.getPersonalInfo().setName("小红");
resumeShallowCopy.getPersonalInfo().setSex("女");
resumeShallowCopy.getPersonalInfo().setAge(18);
resumeShallowCopy.getWorkExperience().setTimeArea("2011-2032");
resumeShallowCopy.getWorkExperience().setCompany("YYY公司");
System.out.println("浅拷贝输出对比:");
resumeShallow.Display();
System.out.println("拷贝后:");
resumeShallowCopy.Display();
System.out.println("");
PersonalInfo personalInfoTwo = new PersonalInfo("小黑", "男", 30);
WorkExperience workExperienceTwo = new WorkExperience("2015-2018", "AAA公司");
ResumeDeep resumeDeep = new ResumeDeep("羽毛球", personalInfoTwo, workExperienceTwo);
ResumeDeep resumeDeepCopy = resumeDeep.clone();
resumeDeepCopy.setSkill("乒乓球");
resumeDeepCopy.getPersonalInfo().setName("小美");
resumeDeepCopy.getPersonalInfo().setSex("女");
resumeDeepCopy.getPersonalInfo().setAge(27);
resumeDeepCopy.getWorkExperience().setTimeArea("2016-2019");
resumeDeepCopy.getWorkExperience().setCompany("BBB公司");
System.out.println("深拷贝输出对比:");
resumeDeep.Display();
System.out.println("拷贝后:");
resumeDeepCopy.Display();
}
}
输出结果(java中浅拷贝的时候会把引用类型String当成基本类型)
浅拷贝输出对比:
个人信息:小红 女 18
工作经历:2011-2032 YYY公司
技能:游泳
拷贝后:
个人简历:小红 女 18
工作经历:2011-2032 YYY公司
技能:跳高
深拷贝输出对比:
个人信息:小黑 男 30
工作经历:2015-2018 AAA公司
技能:羽毛球
拷贝后:
个人简历:小美 女 27
工作经历:2016-2019 BBB公司
技能:乒乓球
GO语言版原型模式(深拷贝与浅拷贝)
创建工个人信息类与工作经历类
type PersonalInfo struct {
Name string
Sex string
Age int
}
type WorkExperience struct {
TimeArea string
Company string
}
创建经历类
type Resume struct {
Skill string
PersonalInfo PersonalInfo
WorkExperience WorkExperience
}
func (this *Resume) SetSkill(skill string) {
this.Skill=skill
}
func (this *Resume) SetPersonalInfo(name string,sex string,age int) {
this.PersonalInfo.Name=name
this.PersonalInfo.Sex=sex
this.PersonalInfo.Age=age
}
func (this *Resume) SetWorkExperience(timeArea string,company string) {
this.WorkExperience.TimeArea=timeArea
this.WorkExperience.Company=company
}
func (this *Resume) Display() {
fmt.Println("个人信息:",this.PersonalInfo.Name," ",this.PersonalInfo.Sex," ",this.PersonalInfo.Age)
fmt.Println("工作经历:",this.WorkExperience.TimeArea," ",this.WorkExperience.Company )
fmt.Println("技能:",this.Skill)
}
func (this *Resume) CloneByDeep() *Resume {
resume :=*this
return &resume
}
func (this *Resume) CloneByShallow() *Resume {
resume :=this
return resume
}
PrototypePatternDemo 演示原型模式
func main() {
personalInfoOne := prototype.PersonalInfo{"小明", "男", 20}
workExperienceOne :=prototype.WorkExperience{"2010-2012", "xxx公司"}
resumeShallow := &prototype.Resume{"游泳",personalInfoOne,workExperienceOne}
resumeShallowCopy :=resumeShallow.CloneByShallow()
resumeShallowCopy.SetSkill("跳高")
resumeShallowCopy.SetPersonalInfo("小红","女",18)
resumeShallowCopy.SetWorkExperience("2011-2032","YYY公司")
fmt.Println("浅拷贝输出对比:")
resumeShallow.Display();
fmt.Println("拷贝后:")
resumeShallowCopy.Display();
fmt.Println("")
personalInfoTwo := prototype.PersonalInfo{"小黑","男",30}
workExperienceTwo :=prototype.WorkExperience{"2015-2018","AAA公司"}
resumeDeep := &prototype.Resume{"羽毛球",personalInfoTwo,workExperienceTwo}
resumeDeepCopy :=resumeDeep.CloneByDeep()
resumeDeepCopy.SetSkill("乒乓球")
resumeDeepCopy.SetPersonalInfo("小美","女",27,)
resumeDeepCopy.SetWorkExperience("2016-2019","BBB公司")
fmt.Println("深拷贝拷贝输出对比:")
resumeDeep.Display()
fmt.Println("拷贝后:")
resumeDeepCopy.Display()
}
输出结果
浅拷贝输出对比:
个人信息: 小红 女 18
工作经历: 2011-2032 YYY公司
技能: 跳高
拷贝后:
个人信息: 小红 女 18
工作经历: 2011-2032 YYY公司
技能: 跳高
深拷贝拷贝输出对比:
个人信息: 小黑 男 30
工作经历: 2015-2018 AAA公司
技能: 羽毛球
拷贝后:
个人信息: 小美 女 27
工作经历: 2016-2019 BBB公司
技能: 乒乓球