设计模式之原型模式

一、介绍

原型模式属于创建型设计模式 ,用于创建重复 的对象,且同时又保证了性能

该设计模式的好处是将对象的创建与调用方分离

其目的就是** 根据一个对象(称为原型)创建一个与其完全相同的对象(当然内存地址不同) **原对象被认为是新对象的原型。

二、实现步骤

原型模式的实现步骤如下:

  • 应用原型模式的类要实现Cloneable接口。
  • 应用原型模式的类要重写Object类定义的clone()方法。
  • 通过调用对象的clone()方法,获得一个与该对象相同的对象。

在重写Object类定义的clone()方法时,直接通过调用super.clone()即可得到一个新对象,如下所示

三、案例

浅拷贝 :复制对象及基本数据类型,引用类型的字段共享原对象得到内存地址。

java 复制代码
public class Person implements Cloneable {
    private String name;
    private Integer age;
    private String sex;
    private List<String> friends = new ArrayList<>();

    public void addFriends(String friends)  {
        this.friends.add(friends);
    }

    @Override
    public Person clone() {
        try {
            Person person = (Person) super.clone(); // 浅拷贝,items引用共享
            return person;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", friends=" + friends +
                '}';
    }


    public void setSex(String sex) {
        this.sex = sex;
    }

}

测试:

深拷贝:递归复制所有引用对象,确保数据独立性。

java 复制代码
public class Person2 implements Cloneable {
    private String name;
    private Integer age;
    private String sex;
    private List<String> friends = new ArrayList<>();

    public void addFriends(String friends)  {
        this.friends.add(friends);
    }

    @Override
    public Person2 clone() {
        try {
            Person2 copy = (Person2) super.clone();
            copy.friends = new ArrayList<>(this.friends); // 手动复制列表元素
            return copy;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", friends=" + friends +
                '}';
    }


    public void setSex(String sex) {
        this.sex = sex;
    }

}

测试:

四、应用场景

  • 资源消耗大对象:如数据库连接配置,避免重复初始化。
  • 动态状态保存:游戏存档、文档历史版本。
  • 复杂对象生成:GUI控件、多层级配置对象。

七、总结

  • 原型模式用于创建具有相同属性的重复对象。
  • 原型模式的实现就是实现Cloneable接口 + 重写clone()方法实现的。
  • Object类的clone()方法实现由JVM实现,性能较好。但仅能实现浅拷贝
复制代码
相关推荐
进击的前栈15 小时前
鸿蒙实战:19 页面全景汇总与 7 大共享设计模式回顾
华为·设计模式·harmonyos
刀法如飞15 小时前
Spring Boot 4.1 + JDK 25 DDD开源脚手架,面向 AI 编程
设计模式·架构·ai编程
折哥的程序人生 · 物流技术专研16 小时前
第8篇:模板方法模式的优缺点与面试高频考点
java·设计模式·面试·模板方法模式·行为型模式·优缺点·扩充系列
学究天人16 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
workflower17 小时前
人形机器人全身运动控制能力大幅提升
人工智能·深度学习·机器学习·设计模式·机器人·自动化
折哥的程序人生 · 物流技术专研17 小时前
Java 23 种设计模式:从踩坑到精通 | 备忘录模式 —— 快照与撤销,给对象装一个“后悔药”
java·设计模式·备忘录模式·行为型模式·java设计模式·从踩坑到精通·撤销重做
Kel17 小时前
万物皆 Runnable:LangChain 如何用一个接口统一模型、链与图
人工智能·设计模式·架构
ttod_qzstudio20 小时前
【软考设计模式】策略模式:算法族的封装与动态切换精讲
设计模式·策略模式
咖啡八杯1 天前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
ttod_qzstudio1 天前
【软考设计模式】外观模式:复杂子系统的“门面“封装与代码填空精讲
设计模式·外观模式