设计模式-原型模式

文章目录

一、详解

  • 概念:实现 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'}]}
相关推荐
4Forsee28 分钟前
【Android】消息机制
android·java·前端
骚戴36 分钟前
PDF或Word转图片(多线程+aspose+函数式接口)
java·开发语言
姓蔡小朋友38 分钟前
SpringDataRedis
java·开发语言·redis
CodeCraft Studio41 分钟前
国产化Excel处理控件Spire.XLS教程:如何使用 Java 将 TXT 文本转换为 Excel 表格
java·word·excel·spire·文档格式转换·txt转excel
朝新_1 小时前
【SpringBoot】玩转 Spring Boot 日志:级别划分、持久化、格式配置及 Lombok 简化使用
java·spring boot·笔记·后端·spring·javaee
m0_748248021 小时前
Spring设计模式刨根问底
java·spring·设计模式
喝杯牛奶丶1 小时前
MySQL隔离级别:大厂为何偏爱RC?
java·数据库·mysql·面试
一 乐1 小时前
二手车销售|汽车销售|基于SprinBoot+vue的二手车交易系统(源码+数据库+文档)
java·前端·数据库·vue.js·后端·汽车
Mos_x2 小时前
15.<Spring Boot 日志>
java·后端
mm-q29152227292 小时前
Java并发编程从入门到进阶 多场景实战
java·开发语言