软件设计之原型模式

原型模式是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。拷贝分浅拷贝和深拷贝。浅拷贝无法拷贝引用对象。在面试的时候,我们会投多家公司,根据岗位的不同我们会适当调整。使用原型模式可以快速达到需求,下面通过这个案例说明。

注意WorkExperience要实现Serializable接口。

复制代码
package Prototype;

import java.io.Serializable;

public class WorkExperience implements Serializable {
    public String workDate;//日期
    public String position;//岗位
}

package Prototype;

import java.io.*;

public class Resume implements Cloneable, Serializable {
    private String name;//姓名
    private int age;//年龄
    private WorkExperience we = new WorkExperience();//工作经验

    public Resume(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setWorkExperience(String workDate, String position) {
        we.workDate = workDate;
        we.position = position;
    }
    public Resume clone() {
        Resume resume = null;
        try {
            resume = (Resume)super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resume;
    }

    public Resume deepClone() {
        Resume resume = null;
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        try {
            //序列化
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            //反序列化
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            resume = (Resume) ois.readObject();
            return resume;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public String toString() {
        return "Resume{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", we.workDate=" + we.workDate +
                ",we.position=" + we.position +
                '}';
    }
}

package Prototype;

public class Client {
    public static void main(String[] args) {
        Resume a = new Resume("张三",20);
        a.setWorkExperience("2023-1","Java工程师");
        Resume b = a.clone();
        b.setWorkExperience("2015-10","前端工程师");
        Resume c = a.deepClone();
        c.setWorkExperience("2015-5","网络工程师");
        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString());
    }
}

第一张简历是原型,第二张是第一张的浅拷贝并且修改了一定的信息,发现第一张与第二张有关工作经验的内容是一样的,因为这两张简历的工作经验指向的是同一个对象,而第三张是深拷贝,引用对象的信息被修改。

相关推荐
羞儿13 天前
【读点论文】Overall positive prototype for few-shot open-set recognition
原型模式·小样本学习·特征优化·开集学习
liangshanbo121513 天前
手写 Function.prototype.call 与 Function.prototype.apply 面试题满分答案
开发语言·javascript·原型模式
江畔柳前堤13 天前
云原生 × AI 全景图谱:从 Kubernetes 到 Agent 基础设施的一次认知跃迁
人工智能·分布式·gpt·云原生·kubernetes·原型模式·agi
艾伦野鸽ggg15 天前
JavaScript 原型链与原型对象详解
javascript·原型模式
AgentMaster15 天前
元数据、血缘、质量、安全四大模块能力拆解,数据治理方案对比:4 种技术路线深度评测
大数据·数据库·数据仓库·人工智能·原型模式
江畔柳前堤20 天前
具身智能全景深度指南(2026年9月版):从“会聊天的AI“到“能干活的机器“
大数据·javascript·图像处理·人工智能·分布式·智慧城市·原型模式
神奇霸王龙1 个月前
Codex MCP GA 实测:Qwen / GLM / Kimi / DeepSeek / MiniMax 调度 Codex 沙箱的真实成本
人工智能·ai·agent·ai编程·原型模式·mcp
葡萄城技术团队1 个月前
如何通过 JSON 数据源 / Web API 快速构建轻量级报表(Report)?
前端·json·原型模式
Leo.yuan1 个月前
2026国内数据治理平台选型指南:从ETL到数据质量的一体化路径
原型模式
一个游离的指针1 个月前
JS中的对象的相关概念
开发语言·javascript·原型模式