原型模式代码举例(java语言版与go语言版)

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公司
技能: 乒乓球

猜你喜欢

转载自blog.csdn.net/qq_35386002/article/details/89312856