【编码魔法师系列_构建型4】原型模式(Prototype Pattern)

👉直达编码魔法师系列其他文章👈

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通过不断的练习和实践,掌握其中的奥妙,选择合适的设计模式,能为我们的项目增加一丝神奇的魔力。

文章目录

概念:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

实例:

克隆原本的五菱宏光对象

目的:

原本的五菱宏光修改配置后,克隆对象配置不变

适用场景:

需要复制一些对象,同时又希望代码独立于这些对象所属的具体类

优点:

1、使用原型模式创建实例对象比直接new一个对象性能好,尤其创建大对象,性能的差别非常明显。

2、简化创建对象的过程,可以直接修改现有的对象实例的值,达到复用的目的

弊端:

1、每个对象内部都要覆盖Object的clone方法才能被拷贝,当对类进行改造时,需要修改代码,违背了"开闭原则"。

2、如果克隆引用数据类型,需要递归克隆

类图:

框架用到的地方:

Java 中,Object 的 clone() 方法

Coding:

Car:

java 复制代码
public class Car {
    private String name;
    private Integer box;
    private String power;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getBox() {
        return box;
    }

    public void setBox(Integer box) {
        this.box = box;
    }

    public String getPower() {
        return power;
    }

    public void setPower(String power) {
        this.power = power;
    }

    public Car() {
    }

    public Car(Car car) {
        this.name = car.getName();
        this.box = car.getBox();
        this.power = car.getPower();
    }

    public Car clone() {
        return new Car(this);
    }

    public void show() {
        System.out.println(
                "一辆" + this.getPower() + this.getBox() + "厢" + this.getName()
        );
    }
}

测试:

java 复制代码
public class Test {
    public static void main(String[] args) {
        Car wuLing = new Car();
        wuLing.setName("五菱宏光");
        wuLing.setBox(2);
        wuLing.setPower("汽油");
        System.out.println("----------原始配置----------");
        wuLing.show();
        //通过clone方法创建的新对象
        Car clone = wuLing.clone();
        wuLing.setBox(3);
        //地址引用
        Car wuLing2 = wuLing;
        System.out.println("----------修改配置后wuLing----------");
        wuLing.show();
        System.out.println("----------原始配置后wuLing2----------");
        wuLing2.show();
        System.out.println("----------原始配置后clone----------");
        clone.show();
    }
}

我们可以看到wuLing2是直接将wuLing复制给自己,因为Java的赋值只是传递地址,所以wuLing2会随着wuLing的配置修改而改变。

但是调用clone的方法并没有因为wuLing的配置修改而修改,这是因为clone是一个被克隆出来的全新对象(java自带的clone方法是浅拷贝)。

如果您想了解更多关于Java深拷贝和浅拷贝的信息,可以到小名的另一篇文章:Java对象浅拷贝与深拷贝进行详细了解😊

测试结果:

html 复制代码
----------原始配置----------
一辆汽油2厢五菱宏光
----------修改配置后wuLing----------
一辆汽油3厢五菱宏光
----------原始配置后wuLing2----------
一辆汽油3厢五菱宏光
----------原始配置后clone----------
一辆汽油2厢五菱宏光

👉直达编码魔法师系列其他文章👈

文章后期会持续优化,如果觉得小名的文章帮助到了您,请关注小名,支持一下小名😄,给小名的文章点赞👍、评论✍、收藏🤞谢谢大家啦~♥♥♥
编码魔法师系列文章,会收录在小名的【设计模式】专栏中,希望大家可以持续关注🎉

相关推荐
西猫雷婶12 分钟前
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
开发语言·python·opencv
kiiila12 分钟前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
初晴~12 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱5813617 分钟前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳38 分钟前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾41 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
黑胡子大叔的小屋1 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark1 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
唐 城1 小时前
curl 放弃对 Hyper Rust HTTP 后端的支持
开发语言·http·rust
星就前端叭1 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc