设计模式-原型模式

文章目录

一、详解

  • 概念:实现 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'}]}
相关推荐
麦麦鸡腿堡3 小时前
Java的动态绑定机制(重要)
java·开发语言·算法
それども3 小时前
SpringBootTest运行线程池被拒绝
java
☆cwlulu3 小时前
c++最常用的几种设计模式
设计模式
介一安全3 小时前
【Frida Android】基础篇6:Java层Hook基础——创建类实例、方法重载、搜索运行时实例
android·java·网络安全·逆向·安全性测试·frida
xyy20253 小时前
Spring事务的传播方式
java·数据库·spring
@Kerry~3 小时前
phpstudy .htaccess 文件内容
java·开发语言·前端
roshy3 小时前
x86、arm、rsc-v指令集架构,指令集、OS、应用3者的关系
java·arm开发·架构
CRMEB系统商城4 小时前
CRMEB多商户系统(PHP)v3.3正式发布,同城配送上线[特殊字符]
java·开发语言·小程序·php
iナナ4 小时前
Java优选算法——位运算
java·数据结构·算法·leetcode