设计模式-原型模式

文章目录

一、详解

  • 概念:实现 Cloneable 接口,该对象通过调用clone()方法拷贝自身,创建新的对象
  • 主要用途:直接创建的对象开销大时,直接克隆已创建的对象,减少开销
  • 代码:实现 cloneable 接口的产品

二、代码

  • 源码:https://gitee.com/deschen/designPattern-study

  • 以文件为例,拷贝文件及文件夹

  • 产品

    java 复制代码
    // 文件抽象类,表示文件这类产品(文件、文件夹)
    public abstract class AbstractFile implements Cloneable {
    
        protected String name;
    
        protected String content;
    
    
        public abstract AbstractFile clone();
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        @Override
        public String toString() {
            return "AbstractFile{" +
                    "name='" + name + '\'' +
                    ", content='" + content + '\'' +
                    '}';
        }
    }
    
    // 文件类
    public class File extends AbstractFile {
    
        public File() {
        }
    
        public File(String name, String content) {
            this.name = name;
            this.content = content;
        }
    
        @Override
        public AbstractFile clone() {
            return new File(this.name, this.content);
        }
    
    }
    
    // 文件夹
    public class Folder extends AbstractFile {
    
        private List<AbstractFile> files;
    
        public Folder(String name) {
            this.name = name;
            this.files = new ArrayList<>();
        }
    
        @Override
        public AbstractFile clone() {
            Folder folder = new Folder(this.name);
            for (AbstractFile file : this.files) {
                folder.addFile(file.clone());
            }
            return folder;
        }
    
        public void addFile(AbstractFile file) {
            this.files.add(file);
        }
    
        public List<AbstractFile> getFiles() {
            return files;
        }
    
        @Override
        public String toString() {
            return "Folder{" +
                    "name='" + name + '\'' +
                    ", content='" + content + '\'' +
                    ", files=" + files +
                    '}';
        }
    }
  • 用例

    java 复制代码
    public class Demo {
    
        public static void main(String[] args) {
            File file = new File("test.doc", "123456");
            Folder folder = new Folder("test");
            folder.addFile(file);
    
            // 拷贝文件
            AbstractFile copyFile = file.clone();
            copyFile.setName("test_copy.doc");
            System.out.println(copyFile.toString());
    
            // 拷贝文件夹
            AbstractFile copyFolder = folder.clone();
            copyFolder.setName("test_copy");
            System.out.println(copyFolder.toString());
        }
    }
    
    // 输出结果
    AbstractFile{name='test_copy.doc', content='123456'}
    Folder{name='test_copy', content='null', files=[AbstractFile{name='test.doc', content='123456'}]}
相关推荐
代码什么用6 小时前
Spring基础使用
java·后端·spring
Su米苏6 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园7 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁7 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网7 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
禾小西7 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨7 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
小卡车5558 小时前
java反射、自定义注解的应用(自定义分页)
java
BLUcoding9 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
yuniko-n9 小时前
【JUC】Lock 和 synchronzied 锁
java