【Java设计模式 | 创建者模式】 原型模式

前言:

创建者模式主要关注是"怎么创建对象?",它的主要特点是将对象的创建和使用分离。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。

创建者模式分为:

单例模式(Singleton): 【Java设计模式 | 创建者模式】单例模式-CSDN博客

工厂方法模式(Factory Method): 【Java设计模式 | 创建者模式】工厂方法模式-CSDN博客

抽象工厂模式(Abstract Factory):【Java设计模式 | 创建者模式】 抽象工厂模式-CSDN博客

原型模式(Prototype):【Java设计模式 | 创建者模式】 原型模式-CSDN博客

建造者模式(Builder)

原型模式

概述:

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

结构:

原型模式包含以下角色:

抽象原型类:规定了具体原型对象必须实现的 clone() 方法。

具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。

访问类:使用具体原型类中的 clone() 方法来复制新的对象。

实现方式:

原型模式的克隆分为浅克隆和深克隆。

浅克隆:只会复制对象本身,如果源对象有引用类型字段则不会复制,而是和源对象使用共同的引用类型字段。

深克隆:将对象本身和对象的引用类型字段一起复制过来,源对象和拷贝对象完全独立。

因为基本类型存储在对象本身的内存空间中,和对象本身是完全绑定的,而引用类型的引用存储在对象实例,而对象实例存储在堆内存中,所以如果源对象只含有基本类型字段,那么深克隆和浅克隆效果一致;如果源对象含有引用类型字段,那么深克隆和浅克隆效果完全不同。

具体实现:

java 复制代码
public class Book implements Cloneable {
    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    @Override
    public Book clone() {
        try {
            return (Book) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError(); // 不会发生
        }
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}
 

使用示例:

java 复制代码
public class PrototypeDemo {
    public static void main(String[] args) {
        Book original = new Book("Design Patterns", "Erich Gamma");
        Book copy = original.clone();

        System.out.println("Original: " + original.getTitle() + " by " + original.getAuthor());
        System.out.println("Copy: " + copy.getTitle() + " by " + copy.getAuthor());

        copy.setTitle("Effective Java");
        System.out.println("Modified Copy: " + copy.getTitle());
        System.out.println("Original remains unchanged: " + original.getTitle());
    }
}
 

输出结果:

stata 复制代码
Original: Design Patterns by Erich Gamma
Copy: Design Patterns by Erich Gamma
Modified Copy: Effective Java
Original remains unchanged: Design Patterns
 

关于深克隆的实现:

实现Cloneable接口和序列化、反序列化的方式,可参考以下链接: 【Java八股 | 基础篇】深拷贝与浅拷贝、注解、异常-CSDN博客

相关推荐
考虑考虑6 小时前
JDK26中的Map.ofLazy
java·后端·java ee
云浪7 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
苏三的开发日记7 小时前
Docker 启动顺序优化(CentOS / Ubuntu)
后端
高频因子挖掘机9 小时前
同一交易日出现重复 K 线:去重前先确认时间、来源和粒度
后端·github·api
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源