23种设计模式之【原型模式】-核心原理与 Java实践

文章目录

原型模式(Prototype Pattern)

原型模式是 23 种设计模式中的一种创建型模式,其核心思想是通过复制(克隆)现有对象来创建新对象,而不是通过 new 关键字新建。这种模式适用于创建成本较高(如初始化步骤复杂、耗时)或需要频繁创建相似对象的场景,通过复制原型对象可以提高创建效率。

核心原理

原型接口(Prototype):

声明克隆方法(通常为clone()),定义复制自身的接口

在 Java 中通常通过实现Cloneable接口来标识可克隆的类
具体原型(Concrete Prototype):

实现原型接口的克隆方法,完成自身的复制

包含需要被复制的属性和方法
客户端(Client):

通过调用原型对象的克隆方法来创建新对象

无需知道具体的创建细节,只需操作原型接口

原型模式的核心是 "对象克隆",通过复制已有对象来生成新对象,避免了重复的初始化过程,提高了对象创建效率。

Java 实践示例

以 "文档模板克隆" 为例实现原型模式:

文档包含标题、内容和格式设置,创建过程复杂

通过克隆现有文档模板快速生成新文档

java 复制代码
package com.example.demo;

public class PrototypePattern {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 创建原型文档(模板)
        Document prototype = new Document();
        prototype.setTitle("周报模板");
        prototype.setContent("本周工作内容:\n1. \n2. \n3.");
        prototype.setFormat(new Format("Arial", 12, "black"));

        System.out.println("=== 原型文档 ===");
        prototype.show();

        // 克隆原型创建新文档1
        Document doc1 = prototype.clone();
        doc1.setTitle("张三的周报");
        doc1.setContent("本周工作内容:\n1. 完成需求分析\n2. 设计数据库\n3. 编写接口文档");

        // 克隆原型创建新文档2
        Document doc2 = prototype.clone();
        doc2.setTitle("李四的周报");
        doc2.setContent("本周工作内容:\n1. 开发用户模块\n2. 修复3个BUG\n3. 编写单元测试");

        System.out.println("\n=== 克隆的文档1 ===");
        doc1.show();

        System.out.println("\n=== 克隆的文档2 ===");
        doc2.show();

        // 验证克隆对象与原型的关系
        System.out.println("\n原型与克隆对象是否为同一实例:" + (prototype == doc1));
        System.out.println("克隆对象的格式是否与原型相同:" + (prototype.getFormat() == doc1.getFormat()));
        //=== 原型文档 ===
        //标题:周报模板
        //内容:本周工作内容:
        //1.
        //2.
        //3.
        //格式:字体=Arial, 字号=12, 颜色=black
        //
        //=== 克隆的文档1 ===
        //标题:张三的周报
        //内容:本周工作内容:
        //1. 完成需求分析
        //2. 设计数据库
        //3. 编写接口文档
        //格式:字体=Arial, 字号=12, 颜色=black
        //
        //=== 克隆的文档2 ===
        //标题:李四的周报
        //内容:本周工作内容:
        //1. 开发用户模块
        //2. 修复3个BUG
        //3. 编写单元测试
        //格式:字体=Arial, 字号=12, 颜色=black
        //
        //原型与克隆对象是否为同一实例:false
        //克隆对象的格式是否与原型相同:true

    }

    // 文档格式类
    public static class Format {
        private String font;    // 字体
        private int fontSize;   // 字号
        private String color;   // 颜色

        public Format(String font, int fontSize, String color) {
            this.font = font;
            this.fontSize = fontSize;
            this.color = color;
        }

        @Override
        public String toString() {
            return "格式:字体=" + font + ", 字号=" + fontSize + ", 颜色=" + color;
        }
    }

    // 文档类(实现原型接口)
    public static class Document implements Cloneable {
        private String title;   // 标题
        private String content; // 内容
        private Format format;  // 格式

        // 克隆方法
        @Override
        public Document clone() throws CloneNotSupportedException {
            // 调用Object类的clone()方法实现浅克隆
            return (Document) super.clone();
        }

        // 显示文档信息
        public void show() {
            System.out.println("标题:" + title);
            System.out.println("内容:" + content);
            System.out.println(format);
        }

        // getter和setter方法
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
        public String getContent() { return content; }
        public void setContent(String content) { this.content = content; }
        public Format getFormat() { return format; }
        public void setFormat(Format format) { this.format = format; }
    }
}

克隆方式详解

  • 浅克隆(Shallow Clone):
    特点:只复制对象本身和基本数据类型字段,引用类型字段只复制引用,不复制引用指向的对象
    Java 实现:通过Object.clone()方法实现,默认是浅克隆
    适用场景:对象中不含引用类型,或引用类型是不可变对象(如 String)
  • 深克隆(Deep Clone):
    特点:不仅复制对象本身,还递归复制所有引用类型字段指向的对象
    Java 实现:
    方式一:重写clone()方法,手动克隆所有引用类型字段
    方式二:通过序列化(Serializable)实现

深克隆实现示例(方式一):

java 复制代码
@Override
public Document clone() throws CloneNotSupportedException {
    // 先浅克隆得到基本类型字段
    Document clone = (Document) super.clone();
    // 手动克隆引用类型字段
    clone.format = new Format(
        this.format.font, 
        this.format.fontSize, 
        this.format.color
    );
    return clone;
}

原型模式的应用场景

  • 对象创建成本高:
    初始化步骤复杂(如需要读取配置文件、数据库连接)
    例如:报表对象、复杂的业务对象
  • 需要频繁创建相似对象:
    对象大部分属性相同,只有少数属性不同
    例如:文档模板、邮件模板、订单模板
  • 避免构造函数的限制:
    当无法通过构造函数创建对象(如私有构造函数)
    例如:克隆单例对象的特殊场景
  • 框架中的应用:
    Java 中的Object.clone()方法是原型模式的基础
    Spring 中的BeanUtils.copyProperties()实现对象复制
    原型模式与工厂模式结合,通过克隆生成产品

原型模式的优势在于简化对象创建过程,提高创建效率,尤其适合创建复杂对象或大量相似对象的场景。使用时需根据需求选择浅克隆或深克隆,避免引用共享导致的意外问题。

相关推荐
小咕聊编程12 分钟前
【含文档+PPT+源码】基于spring boot的固定资产管理系统
java·spring boot·后端
roykingw13 分钟前
【终极面试集锦】如何设计微服务熔断体系?
java·微服务·面试
我命由我1234514 分钟前
Spring Cloud - Spring Cloud 微服务概述 (微服务的产生与特点、微服务的优缺点、微服务设计原则、微服务架构的核心组件)
java·运维·spring·spring cloud·微服务·架构·java-ee
それども17 分钟前
忽略Lombok构建警告
java·开发语言·jvm
用户685453759776924 分钟前
🎮 Java设计模式:从青铜到王者的代码修炼手册
java·后端
马尚道39 分钟前
Java高手速成--吃透源码+手写组件+定制开发教程
java
我命由我1234544 分钟前
Spring Cloud - Spring Cloud 注册中心与服务提供者(Spring Cloud Eureka 概述、微服务快速入门、微服务应用实例)
java·spring boot·spring·spring cloud·微服务·eureka·java-ee
MetaverseMan1 小时前
Java Spring 框架的`@Autowired` 注解 以及依赖注入分析
java·开发语言·spring
一吃就胖的1 小时前
【给服务器安装服务器安装nacos】
java·运维·服务器
码住懒羊羊1 小时前
【C++】stack|queue|deque
java·开发语言·c++