原型模式

为什么要使用原型模式

不用重新初始化对象,而是动态地获得对象运行时的状态。适用于当创建对象的成本较高时,如需进行复杂的数据库操作或复杂计算才能获得初始数据。

优点是可以隐藏对象创建的细节,减少重复的初始化代码;可以在运行时动态地增加和删除产品。

什么是原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通

过复制这些原型创建新的对象

"原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

组成

  1. Prototype(原型) :
    • 定义一个包含克隆自身的方法的接口。在 Java 中,可以通过实现 Cloneable 接口来达到这个目的。
  2. Concrete Prototype(具体原型) :
    • 实现或继承原型接口,并重写克隆方法。
  3. Client(客户端) :
    • 创建一个新对象,通过复制原型实例来完成。

怎么使用

Java实现原型模式的步骤:

  1. 创建原型接口 :
    • 在 Java 中,通常使用 Cloneable 接口作为原型。
  2. 实现具体的原型类 :
    • 创建类,实现 Cloneable 接口。
    • 重写 clone() 方法,根据需要进行深拷贝或浅拷贝。
  3. 在客户端代码中复制对象 :
    • 使用原型实例的 clone() 方法来获取对象的副本。

什么时候使用

一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高,

浅拷贝和深拷贝

  • 浅复制,被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
  • 深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象

浅拷贝

java 复制代码
public class ShallowCopyExample implements Cloneable {
    private int[] data;

    public ShallowCopyExample() {
        data = new int[10];
        for (int i = 0; i < data.length; i++) {
            data[i] = i;
        }
    }

    public void setData(int index, int value) {
        data[index] = value;
    }

    public int[] getData() {
        return data;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) {
        ShallowCopyExample e1 = new ShallowCopyExample();
        ShallowCopyExample e2 = null;

        try {
            e2 = (ShallowCopyExample) e1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        e1.setData(0, 999);
        int[] e2Data = e2.getData();
        System.out.println("Shallow Copy Example: " + e2Data[0]); // 输出 999,因为是浅拷贝
    }
}

深拷贝

和上面浅拷贝不同的是重写 clone() 方法,在其中不仅调用 super.clone(),还要为所有的对象成员变量创建新的实例。

java 复制代码
public class DeepCopyExample implements Cloneable {
    private int[] data;

    public DeepCopyExample() {
        data = new int[10];
        for (int i = 0; i < data.length; i++) {
            data[i] = i;
        }
    }

    public void setData(int index, int value) {
        data[index] = value;
    }

    public int[] getData() {
        return data;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopyExample copy = (DeepCopyExample) super.clone();
        copy.data = data.clone(); // 复制数组,而不是引用
        return copy;
    }

    public static void main(String[] args) {
        DeepCopyExample e1 = new DeepCopyExample();
        DeepCopyExample e2 = null;

        try {
            e2 = (DeepCopyExample) e1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        e1.setData(0, 999);
        int[] e2Data = e2.getData();
        System.out.println("Deep Copy Example: " + e2Data[0]); // 输出 0,因为是深拷贝
    }
}
相关推荐
方见华Richard1 天前
整数阶时间重参数化:基于自适应豪斯多夫维数的偏微分方程正则化新框架
人工智能·笔记·交互·原型模式·空间计算
方见华Richard3 天前
世毫九《认知几何学修订版:从离散概念网络到认知拓扑动力学》
人工智能·经验分享·交互·原型模式·空间计算
方见华Richard3 天前
自指系统的安全本体论:论内生安全性的哲学基础与形式化路径
人工智能·经验分享·交互·学习方法·原型模式
xianyinsuifeng3 天前
RAG + Code Analysis 的标准路线
数据仓库·自动化·云计算·原型模式·aws
Beginner x_u5 天前
JavaScript 原型、原型链与原型继承的核心机制解析
开发语言·javascript·原型模式·原型原型链
方见华Richard6 天前
递归对抗引擎(RAE)核心极简实现框架
人工智能·交互·学习方法·原型模式·空间计算
方见华Richard6 天前
递归对抗引擎RAE V2.0(多智能体分布式对抗版)
人工智能·经验分享·交互·学习方法·原型模式
方见华Richard6 天前
递归对抗引擎RAE V3.0(碳硅共生版)
人工智能·经验分享·学习方法·原型模式·空间计算
懵萌长颈鹿7 天前
原型模式 (Prototype Pattern)
原型模式
2601_949480068 天前
Flutter for OpenHarmony音乐播放器App实战:定时关闭实现
javascript·flutter·原型模式