当前位置: 首页 > news >正文

23种设计模式-创建型模式-原型

文章目录

  • 简介
  • 场景
  • 解决
  • 示例
    • 1. 基础抽象父类定义
    • 2. 矩形子类实现
    • 3. 圆形子类实现
    • 4. 客户端调用示例
  • 总结

简介

原型是一种创建型设计模式,它允许你复制现有对象,而不需要依赖它们的类。

场景

假设你有一个对象,你想创建它的一个完美副本。你会怎么做?首先,你必须创建一个相同类的新对象。然后你必须遍历原始对象的所有字段,并把它的值复制到新对象。
但是有一个问题。某些对象的字段可能是私有的,从对象本身外部不可见。
在这里插入图片描述

直接复制还有一个问题。你必须知道对象的类才能创建副本,因此你的代码会依赖这个类。有时你只知道对象实现的接口,但不知道具体类。

解决

原型模式把克隆过程委托给要克隆的实际对象。它为所有要克隆的对象声明一个通用接口。此接口允许你克隆对象,但不需要把代码与对象的类耦合。通常,这样的接口只包含一个clone方法。
clone的实现在所有类中类似。它创建当前类的一个对象,并且把旧对象的所有字段值转移到新对象里。你甚至可以复制私有字段,因为大多数编程语言都允许对象访问属于同一类的其他对象的私有字段。
支持克隆的对象称为原型

示例

在这里插入图片描述

1. 基础抽象父类定义

abstract class Shape implements Cloneable {
    protected int xCoord;
    protected int yCoord;
    protected String fillColor;

    // 基础构造方法
    public Shape() {
        this.xCoord = 0;
        this.yCoord = 0;
        this.fillColor = "#FFFFFF";  // 默认填充颜色
    }

    // 原型构造方法(拷贝构造核心)
    protected Shape(Shape prototype) {
        this.xCoord = prototype.xCoord;         // 坐标克隆
        this.yCoord = prototype.yCoord;         // 实现位置复制
        this.fillColor = prototype.fillColor;   // 颜色属性继承
    }

    public abstract Shape clone();
}

2. 矩形子类实现

class Rectangle extends Shape {
    private int width;
    private int height;

    public Rectangle(Rectangle source) {
        super(source);             // 调用父类拷贝构造
        this.width = source.width;       // 特有属性复制
        this.height = source.height;     // 包括宽高参数
    }

    @Override
    public Rectangle clone() {     // 返回具体子类类型
        return new Rectangle(this);     // 原型引导构造
    }
}

3. 圆形子类实现

class Circle extends Shape {
    private int radius;

    public Circle(Circle source) {
        super(source);           // 父类属性初始化
        this.radius = source.radius;   // 半径参数拷贝
    }

    public void setRadius(int r) {
        this.radius = r;          // 半径独立可变
    }

    @Override
    public Circle clone() {
        return new Circle(this);      // 生成新实例
    }
}

4. 客户端调用示例

Shape prototype = new Circle();
prototype.setPosition(15, 20);
prototype.setColor("#FFA500");

// 快速生成克隆体
Shape clonedCircle = prototype.clone();  // 无需知道具体类型
clonedCircle.move(5, 5);                 // 获得独立坐标

// 构造矩形原型
Shape rectProto = new Rectangle();
rectProto.setSize(100, 200);            // 原始配置
Shape clonedRect = rectProto.clone();   // 完美复制属性

总结

在这里插入图片描述

  1. 原型(Pro­to­type)接口:声明Clone方法。在绝大多数情况下,里面只会有一个clone方法。
  2. 具体原型(Con­crete Pro­to­type)类:实现Clone方法。除了把原始对象的数据复制到新的克隆体中之外,这个方法有时还需处理克隆过程中的极端情况,例如克隆关联对象和递归依赖等等。
  3. 客户端(Client)可以复制实现了原型接口的任何对象。

相关文章:

  • 4、操作系统结构和发展史
  • 深入理解8086指令集与反汇编技术
  • Pythonload JSON文件需要手动关闭吗?
  • 钞票准备好了吗?鸿蒙电脑 5 月见
  • linux去掉绝对路径前面部分和最后的/符号
  • CSS语言的服务器管理
  • JVM 03
  • 【专业测评】STONE 80A-L 电调:轻量化革命下的工业级动力心脏 ——112g 机身承载 80A 持续输出,重新定义无人机动力系统标杆
  • 秒杀业务优化之从分布式锁到基于消息队列的异步秒杀
  • JavaScript中匿名函数与箭头函数之间的区别与联系
  • Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)
  • 2023年TEVC SCI1区TOP:基于粒子群算法的紧凑神经结构搜索图像分类
  • 《论语别裁》第02章 为政(04) 刘备上了曹操的当
  • AF3 Rigid类make_transform_from_reference方法解读
  • C++题目
  • NO.56|基础算法-模拟|多项式输出|蛇形方阵|字符串的展开|方向向量(C++)
  • 《汽车理论》第一章作业1.3
  • 如何学好linux驱动
  • 【机器学习】什么是线性回归?
  • 3.24-1接口测试理论
  • 运动健康|不同能力跑者,跑步前后营养补给差别这么大?
  • 临港迎来鸿蒙智行“尚界”整车及电池配套项目,首款车型今秋上市
  • 五一期间上海景观照明开启重大活动模式,外滩不展演光影秀
  • 上海第三家“胖永辉”在浦东开业,设立了外贸产品专区
  • 李公明|一周画记:哈佛打响第一枪
  • 人社部:就业政策储备充足,将会根据形势变化及时推出