简谈设计模式之原型模式

原型模式是一种创建型设计模式, 用于创建对象, 而不必指定它们所属的具体类. 它通过复制现有对象 (即原型) 来创建新对象. 原型模式适用于当创建新对象的过程代价较高或复杂时, 通过克隆现有对象来提高性能

原型模式结构
  • 原型接口. 声明一个克隆自身的接口
  • 具体原型. 实现克隆的具体方法
  • 客户端. 通过调用具体原型中的克隆方法来创建新对象
原型模式实现
// 原型接口
interface Prototype {
    Prototype clone();
}

// 具体原型类
class ConcretePrototype implements Prototype {
    private String field;
    
    public ConcretePrototype(String field) {
        this.field = field;
    }
    
    // 实现克隆方法
    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.field);
    }
    
    @Override
    public String toString() {
        return "ConcretePrototype{" + "field = " + field + '\'' + '}';
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建原型对象
        ConcretePrototype prototype = new ConcretePrototype("prototype");
        
        // 克隆原型对象
        ConcretePrototype clone = (ConcretePrototype) prototype.clone();
        
        System.out.println(prototype);
        System.out.println(clone);
    }
}

在原型模式中, 克隆可以分为浅拷贝和深拷贝

  • 浅拷贝: 复制对象时, 只复制对象本身的基本数据类型字段和对象的引用, 而不复制引用对象本身
  • 深拷贝: 复制对象时, 不仅复制对象本身的基本数据类型字段和对象的引用, 还复制所有引用对象, 递归地进行复制

下面是深拷贝和浅拷贝的实例

浅拷贝:

import java.util.ArrayList;
import java.util.List;

// 具体原型类
class ConcretePrototype implements Prototype {
    private List<String> list;

    public ConcretePrototype() {
        this.list = new ArrayList<>();
    }

    public void addItem(String item) {
        this.list.add(item);
    }

    @Override
    public Prototype clone() {
        try {
            return (ConcretePrototype) super.clone(); // 浅拷贝
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "ConcretePrototype{" + "list=" + list + '}';
    }
}

深拷贝:

import java.util.ArrayList;
import java.util.List;

// 具体原型类
class ConcretePrototype implements Prototype {
    private List<String> list;

    public ConcretePrototype() {
        this.list = new ArrayList<>();
    }

    public void addItem(String item) {
        this.list.add(item);
    }

    @Override
    public Prototype clone() {
        ConcretePrototype clone = new ConcretePrototype();
        clone.list = new ArrayList<>(this.list); // 深拷贝
        return clone;
    }

    @Override
    public String toString() {
        return "ConcretePrototype{" + "list=" + list + '}';
    }
}

相关推荐

  1. 设计模式原型模式

    2024-07-10 08:26:03       33 阅读
  2. 设计模式设计原则

    2024-07-10 08:26:03       33 阅读
  3. 设计模式工厂模式

    2024-07-10 08:26:03       27 阅读
  4. 设计模式适配器模式

    2024-07-10 08:26:03       29 阅读
  5. 设计模式建造者模式

    2024-07-10 08:26:03       21 阅读
  6. 设计模式单例模式

    2024-07-10 08:26:03       25 阅读
  7. 设计模式桥接模式

    2024-07-10 08:26:03       28 阅读
  8. 设计模式原型模式

    2024-07-10 08:26:03       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 08:26:03       114 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 08:26:03       124 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 08:26:03       101 阅读
  4. Python语言-面向对象

    2024-07-10 08:26:03       112 阅读

热门阅读

  1. GPT带我学-设计模式-13策略模式

    2024-07-10 08:26:03       31 阅读
  2. 写一个字符设备的驱动步骤

    2024-07-10 08:26:03       31 阅读
  3. Transformer和Bert的原理是什么

    2024-07-10 08:26:03       30 阅读
  4. 使用tkinter 制作工作流ui

    2024-07-10 08:26:03       27 阅读
  5. postman工具介绍

    2024-07-10 08:26:03       28 阅读
  6. vue-路由自动化

    2024-07-10 08:26:03       23 阅读
  7. el-date-picker 扩展

    2024-07-10 08:26:03       27 阅读
  8. Go语言入门之变量、常量、指针以及数据类型

    2024-07-10 08:26:03       24 阅读
  9. Kotlin 处理livedata数据倒灌

    2024-07-10 08:26:03       26 阅读
  10. 针对vue3的render函数添加自定义指令

    2024-07-10 08:26:03       27 阅读
  11. Kotlin中的关键字

    2024-07-10 08:26:03       28 阅读
  12. Matlab 使用

    2024-07-10 08:26:03       29 阅读
  13. AI学习指南机器学习篇-层次聚类原理

    2024-07-10 08:26:03       32 阅读
  14. k8s-第一节-minikube

    2024-07-10 08:26:03       28 阅读