【学习笔记】设计模式-原型模式/克隆模式(Prototype)

0 设计模式

不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式

https://blog.csdn.net/qq_42874315/article/details/120006447

1 原型模式

原型模式的本质就是克隆,原型就相当于是一个可供复制的模板,在我们日常使用的时候,无需重新new对象和赋值,直接克隆对象即可。

对象的创建方式有两种

  1. new一个对象,指定属性
  2. 如果新的对象和原来的对象属性差不多,这时可以从原对象克隆

2 实现思路

克隆又分为深克隆和浅克隆

2.1 浅克隆

在这里插入图片描述

克隆后的对象中的属性和被克隆对象的属性指向同一个引用,也就是说被克隆对象改变属性,克隆对象也会变

2.2 深克隆

在这里插入图片描述

克隆对象和被克隆对象指向的地址不同,一个对象属性的改变不会造成被克隆对象属性的改变

3 需要的类

这里采用Java自带的原型模式

  1. 需要被克隆的类实现Cloneable接口

  2. 重写clone方法

  3. 注意,深克隆和浅克隆的区分就在clone方法中

    浅克隆:在clone方法中:return super.clone()

    深克隆:在clone方法中:新建一个对象,新对象 = super.clone(),然后return 新对象

4 具体实现

4.1 浅克隆

/**
 * 浅克隆(两个对象指向同一个引用,会有影响)
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/26 22:27
 */
public class Test {
    public static void main(String[] args) {
        Person p1 = new Person();
        try {
            Person p2 = (Person) p1.clone();
            System.out.println(p2.age + " " + p2.score );
            System.out.println(p2.loc);

            System.out.println(p1.loc == p2.loc);
            p1.loc.street = "sh";
            System.out.println(p2.loc);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

class Person implements Cloneable{
    int age = 8;
    int score = 100;
    Location loc = new Location("bj",22);

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Location{
    String street;
    int roomNo;

    public Location(String street, int roomNo) {
        this.street = street;
        this.roomNo = roomNo;
    }

    @Override
    public String toString() {
        return "Location{" +
                "street='" + street + '\'' +
                ", roomNo=" + roomNo +
                '}';
    }
}

4.2 深克隆

/**
 * 深克隆处理(克隆与被克隆对象之间没有影响了)
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/26 22:27
 */
public class Test {
    public static void main(String[] args) {
        Person p1 = new Person();
        try {
            Person p2 = (Person) p1.clone();
            System.out.println(p2.age + " " + p2.score );
            System.out.println(p2.loc);

            System.out.println(p1.loc == p2.loc);
            p1.loc.street = "sh";
            System.out.println(p2.loc);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

class Person implements Cloneable{
    int age = 8;
    int score = 100;
    Location loc = new Location("bj",22);

    @Override
    public Object clone() throws CloneNotSupportedException {
        Person p = (Person) super.clone();
        p.loc = (Location) loc.clone();
        return p;
    }
}

class Location implements Cloneable{
    String street;
    int roomNo;

    public Location(String street, int roomNo) {
        this.street = street;
        this.roomNo = roomNo;
    }

    @Override
    public String toString() {
        return "Location{" +
                "street='" + street + '\'' +
                ", roomNo=" + roomNo +
                '}';
    }

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

5 思维导图

在这里插入图片描述

6 示例源码地址

https://github.com/ChenJiahao0205/design-pattern/tree/master

最后

我是通过马士兵老师的视频和菜鸟教程学习的,部分内容可能会有雷同

想阅读更多设计模式相关文章,欢迎到我的专栏【设计模式学习笔记】、【设计模式】中去查看

在23篇设计模式文章发布完成之后,我会公开完整的思维导图,点关注,不迷路

感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五条Programmer

比心~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值