【设计模式】原型模式详解

概述

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可以生产多个等级的产品

结构
  • 抽象原型类:规定了具体原型对象必须实现的clone()方法
  • 具体原型类:实现抽象原型类的clone()方法,它是可以被复制的对象。
  • 访问类:使用原型类中的clone()方法来复制新的对象
分类
  • 浅克隆(也就是浅拷贝):创建一个新的对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原油属性所指向的内存地址。(原型模式)
  • 深克隆(也就是深拷贝):创建一个新对象,属性引用的其他对象也会被克隆,不再指向原有对象地址。 (扩展)

Java中的Object类中提供了clone()方法来实现浅克隆。Cloneable是实现浅克隆的接口

使用场景
  • 对象的创建非常复杂,可以使用原型模式快捷的创建对象。
  • 性能的安全要求比较高。

深克隆

需要用序列化和反序列化来操作

java 复制代码
import java.util.ArrayList;

class Person implements Cloneable {
    private String name;
    private ArrayList<String> hobbies;

    public Person(String name) {
        this.name = name;
        this.hobbies = new ArrayList<>();
    }

    public void addHobby(String hobby) {
        this.hobbies.add(hobby);
    }

    public String getName() {
        return this.name;
    }

    // 新增深复制getHobbies方法
    public ArrayList<String> getDeepCopyOfHobbies() {
        return new ArrayList<>(this.hobbies);
    }

    // 重写clone方法以实现深复制
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person clonedPerson = (Person) super.clone();
        // 对引用类型的hobbies进行深复制
        clonedPerson.hobbies = new ArrayList<>(this.hobbies);
        return clonedPerson;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("Alice");
        person1.addHobby("Reading");

        // 使用clone方法创建深复制对象
        Person person2 = (Person) person1.clone();
        person2.getName();  // 输出"Alice"
        person2.getHobbies().add("Swimming");  // 修改person2的爱好

        // 由于进行了深复制,所以person1和person2的hobbies引用不同的对象
        System.out.println(person1.getHobbies());  // 输出[Reading]
        System.out.println(person2.getHobbies());  // 输出[Reading, Swimming]
    }
}

以上代码展示了Java中实现原型模式的基本结构。通过clone()方法,我们可以创建一个与原始对象具有相同状态的新对象,这在某些场景下可以显著提高对象创建的效率,尤其是当初始化成本较高的时候。注意这里的clone()方法使用了序列化的方式来实现深复制,确保复制出的对象与原对象内容相同但内存空间独立。

相关推荐
Asort4 小时前
JavaScript设计模式(十八)——备忘录模式:状态保存与恢复的艺术
前端·javascript·设计模式
原来是好奇心4 小时前
告别if-else!使用策略模式优雅处理多种MQTT消息类型
java·mqtt·设计模式·策略模式·emqx
AY呀4 小时前
# 从 HTML5 敲击乐到前端工程化:模块化开发如何重塑交互体验
设计模式
天南星5 小时前
23种设计模式-深度讲解-7. 装饰器模式 (Decorator)
后端·设计模式
hans汉斯5 小时前
【计算机科学与应用】基于多光谱成像与边缘计算的物流安全风险预警模式及系统实现
大数据·数据库·人工智能·设计模式·机器人·边缘计算·论文笔记
杯莫停丶6 小时前
设计模式之:适配器模式
设计模式·适配器模式
xiezhr6 小时前
见过哪些醍醐灌顶的Java代码:从"卧槽"到"原来如此"的顿悟
java·后端·设计模式
WaWaJie_Ngen6 小时前
【设计模式】适配器模式(Adapter)
设计模式·适配器模式
Mr_WangAndy17 小时前
C++设计模式_行为型模式_策略模式Strategy
c++·设计模式·策略模式·依赖倒置原则
LoveXming17 小时前
Chapter11—适配器模式
c++·设计模式·适配器模式·开闭原则