设计模式-原型模式

文章目录

一、详解

  • 概念:实现 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'}]}
相关推荐
TTBIGDATA1 小时前
【Hue】Ambari 页面启动 Hue 失败 user ‘hadoop‘ does not exist
java·hadoop·ambari
饺子大魔王的男人2 小时前
Remote JVM Debug+cpolar 让 Java 远程调试超丝滑
java·开发语言·jvm
Hx_Ma169 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode10 小时前
原子操作类LongAdder
java·开发语言
舟舟亢亢10 小时前
Java集合笔记总结
java·笔记
小酒窝.11 小时前
【多线程】多线程打印ABC
java
乡野码圣11 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
JAVA+C语言11 小时前
如何优化 Java 多主机通信的性能?
java·开发语言·php
编程彩机12 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
小酒窝.13 小时前
【多线程】多线程打印1~100
java·多线程