设计模式之原型模式

目录

1.原型模式的概念

2.原型模式的结构图

3.练习实例

4.总结


1.原型模式的概念

2.原型模式的结构图

3.练习实例

需要被复制的对象:

@Data
@AllArgsConstructor
public class Clone implements Cloneable{
    private int age;
    private Date birthday;

    public Clone clone() throws CloneNotSupportedException {
        Object clone = super.clone();
        return (Clone)clone;
    }

}

测试代码:

public class Test {
    public static void main(String[] args) {
        Clone clone = new Clone("张三",18,new Date());
        try {
            Clone clone1 = clone.clone();
            Clone clone2 = clone.clone();
            System.out.println(clone1 == clone2);//false 说明生成两个对象
            System.out.println(clone1.getBirthday() == clone2.getBirthday());//true 说明共用一个对象

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

如果一个对象实现了Cloneable接口且调用了clone()方法的话就会生成另外一个“一样”的自己,但是生成的对象其基本数据类型(8大基本数据类型和其对应的包装类)和原对象是两套,各自拥有各自的,但是其引用数据类型是共用的一套,意思其引用数据类型(类类型,接口类型,数组类型)的属性其实没有被克隆,这也就是浅克隆

如果想实现深克隆可以这么做:

需要被复制的对象:

@Data
@AllArgsConstructor
public class Clone implements Cloneable, Serializable {
    private char aChar;
    private Date birthday;

    public Clone clone() throws CloneNotSupportedException {
        Object clone = super.clone();
        Clone clone1 = (Clone) clone;
        clone1.birthday =(Date) this.birthday.clone();
        return (Clone)clone;
    }

}

测试类:


public class Test {
    public static void main(String[] args) {
        Clone clone = new Clone('c',new Date());
        try {
            Clone clone1 = clone.clone();
            Clone clone2 = clone.clone();
            System.out.println(clone1 == clone2);//false 说明生成两个对象
            System.out.println(clone1.getBirthday() == clone2.getBirthday());//false 说明是两个对象

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

深克隆:把要复制的对象所引用的对象都复制了一遍。

如果想要使用克隆只需要使类实现cloneable接口

4.总结

使用场景:

1.当我们的类初始化需要避免消耗很多的资源时,就可以使用原型模式,因为我们的克隆不会执行构造方法,是从内存中获取数据,避免了初始化占有的时间和空间。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值