Prototype Pattern —— Creational Class

这篇具有很好参考价值的文章主要介绍了Prototype Pattern —— Creational Class。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Background knowledge

在Java中,Cloneable 接口是一个标记接口(Marker Interface,它们内部都没有方法和属性),实现Cloneable接口表示该对象能被克隆,能使用Object.clone()方法。

要实现克隆功能,需要满足以下两个条件:

  • 类实现了 Cloneable 接口。
  • 在类中重写 clone() 方法。

What is Prototype Pattern

为了方便记忆,原型模式也叫克隆模式,我说的!

原型模式通过复制现有对象来创建新对象,而无需显式地使用构造函数。原型模式允许动态创建对象,并且可以避免创建子类的复杂性。原型模式可以结合其他设计模式使用,例如工厂方法模式,以便更灵活地创建对象。

这个复制分为两种模式:

  • 深复制
    深克隆(Deep Clone),深克隆是指创建一个新对象,并将原始对象的所有成员变量(无论是值类型还是引用类型)的值都复制到新对象中,包括引用类型成员变量所引用的对象。这样,新对象和原始对象将拥有彼此独立的成员变量副本,彼此之间的修改不会相互影响。深克隆涉及到递归地复制对象及其引用对象的过程,因此可能会比较复杂和耗时。
    一般考虑使用深克隆,就是因为有可变的引用类型会受影响, 既然引用类型无法被完全克隆,那么我们可以考虑在引用类型所在的类也实现Cloneable接口。有多少个引用类型,就去实现多少个Cloneable接口。

  • 浅复制
    浅克隆(Shallow Clone),浅克隆是指创建一个新对象,并将原始对象的非引用类型成员变量的值复制到新对象中。对于引用类型成员变量,浅克隆将复制引用,使新对象和原始对象共享相同的引用对象。这意味着在浅克隆后,如果修改其中一个对象的引用类型成员变量,将会影响到另一个对象。因此,浅克隆只复制对象的表面结构,而不涉及引用对象本身的复制。

    浅拷贝的情况下,原被克隆对象发生变化后,克隆对象的基本数据类型不可变引用数据类型(String)的数据不会发生影响,而一些其他字段为可变的应用类型,只要克隆对象的内容随着被克隆对象的变化发生了同样的变化,说明两个对象的属性字段指向同一个引用,才会造成这样的结局。(我就碰到过因为对象被同事插进来的代码导致对象发生了变更,代码出现BUG的问题,后面是使用的深拷贝才消除同事的代码对该对象的影响)。

    如果克隆的对象内没有可变的引用对象,都是只用使用一些基础类型,那么直接用浅拷贝即可。

配合其他设计模式:
原型模式可以结合其他设计模式使用,例如工厂方法模式,以便更灵活地创建对象。

Key elements

  • 抽象原型类
  • 具体实现类
  • Client

Example of Draw shape —— shallow clone

以下是一个简单的浅克隆例子。

抽象原型类:

abstract class Shape implements Cloneable {
    protected String type;

    abstract void draw();

    @Override
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

具体实现类:

// 具体原型类 - Rectangle
class Rectangle extends Shape {
    public Rectangle() {
        this.type = "Rectangle";
    }

    public void draw() {
        System.out.println("Drawing a rectangle.");
    }
}

// 具体原型类 - Circle
class Circle extends Shape {
    public Circle() {
        this.type = "Circle";
    }

    public void draw() {
        System.out.println("Drawing a circle.");
    }
}

Client:

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Shape rectangle = new Rectangle();
        Shape circle = new Circle();

        Shape clonedRectangle = (Shape) rectangle.clone();
        Shape clonedCircle = (Shape) circle.clone();

        System.out.println("Original Rectangle Type: " + rectangle.type);
        rectangle.draw(); // Drawing a rectangle.
        System.out.println("Cloned Rectangle Type: " + clonedRectangle.type);
        clonedRectangle.draw(); // Drawing a rectangle.

        System.out.println("Original Circle Type: " + circle.type);
        circle.draw(); // Drawing a circle.
        System.out.println("Cloned Circle Type: " + clonedCircle.type);
        clonedCircle.draw(); // Drawing a circle.
    }
}

在上面的示例中,我们定义了抽象原型类 Shape,它包含了 clone() 方法和 draw() 方法。然后,我们实现了具体的原型类 Rectangle 和 Circle,它们继承自 Shape 并实现了相应的方法。

在客户端代码中,我们首先创建了一个原始的 Rectangle 对象和一个原始的 Circle 对象。然后,我们分别对它们进行克隆,并得到克隆后的 Shape 对象。

通过原型模式,我们可以通过克隆(浅克隆)现有对象来创建新对象,而无需显式地调用构造函数。这消除了重复创建相似对象的需要,并提高了性能。

Reference

深克隆请参考这个文章
https://cloud.tencent.com/developer/article/1628044文章来源地址https://www.toymoban.com/news/detail-681460.html

到了这里,关于Prototype Pattern —— Creational Class的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式--原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目的是通过复制现有对象来创建新的对象,而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象,然后通过复制它来创建新的对象,从而避免了重复构建相似的对象。 在原型模式中

    2024年02月11日
    浏览(40)
  • 设计模式——原型模式(Prototype Pattern)

    概述        原型模式(Prototype  Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。原型模式的工作原理很简单:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自

    2024年01月16日
    浏览(47)
  • 设计模式|原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而无需显式地指定它们的类。这种模式通常用于当对象的创建成本较高,或者对象初始化过程比较复杂时。 原型模式的主要角色包括原型接口(Prototype Interface)、具体原型类(

    2024年04月23日
    浏览(27)
  • 设计模式六:原型模式(Prototype Pattern)

    原型模式是一种创建对象的设计模式。它允许我们通过复制一个现有对象来创建新的对象,而无需知道其具体实现细节。在使用原型模式时,我们首先创建一个原始对象,然后根据需要复制该对象,以获得新创建的对象。 原型模式的主要思想是基于对象的复制。通过使用原型

    2024年02月14日
    浏览(43)
  • 原型模式 Prototype Pattern 《游戏编程模式》学习笔记

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 假设我现在要做一款游戏,这个游戏里有许多不同种类的怪物,鬼魂,恶魔和巫师。这些怪物通过“生产者”进入这片区域,每种敌人有不同的生产者。 假设每种怪物都有不同的类,同时他们都继承怪

    2024年02月12日
    浏览(38)
  • 创建型设计模式:5、原型模式(Prototype Pattern)

    目录 1、原型模式的含义 2、C++实现原型模式的简单实例 1、原型模式的含义 通过复制现有对象来创建新对象,而无需依赖于显式的构造函数或工厂方法,同时又能保证性能。 The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is det

    2024年02月13日
    浏览(43)
  • 【编码魔法师系列_构建型4】原型模式(Prototype Pattern)

    👉直达编码魔法师系列其他文章👈 学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通过不断的练习和

    2024年01月19日
    浏览(37)
  • Template Pattern —— Behavioral Class

    钩子方法(Hook Method)之所以被称为“钩子”,是因为它在算法或流程中提供了一个“钩子”,允许子类在特定的点上“钩入”自己的实现逻辑,从而影响算法的行为或流程的执行。 它类似于一个挂钩、锚点,所以叫Hook method, 它允许子类插入自定义的代码来改变或扩展算法的

    2024年02月10日
    浏览(38)
  • Builder Pattern —— Structure Class

    建造者模式又称为 生成器模式 ,主要用于对复杂对象的构建、初始化,它可以 将多个简单的组件对象按顺序一步步组装起来 , 最终构建成一个复杂的成品对象 。 与工厂系列模式不同的是,建造者模式的主要目的在于把烦琐的 构建过程 从不同对象中抽离出来,使其脱离并

    2024年02月10日
    浏览(35)
  • Strategy Pattern and Polymorphism —— Behavioral Class

    策略模式很类似现在多功能的洗衣机,每次在洗衣服之前,都需要由用户自己选择想要的洗衣策略,洗衣机收到指定的洗衣策略后,组合成一份新的算法和数据结构才去执行。 策略模式和状态模式的区别在于使用者对它们的 目的 。 策略模式主要用于实现算法的选择和动态切

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包