了解23种设计模式之原型模式

一,什么是原型模式。

Prototype 模式 是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。

二,原型模式的特点。

由原型对象自身创建目标对象,通过实现接口 (Cloneable) ,目标对象是原型对象的一个克隆,不仅仅是具有相同的结构,属性,还与原型对象具有相同的值。

但是 在实例化目标对象,和实例化原型对象后, 在jvm 虚拟机 堆内存里是 两个地址不相同的引用对象。

根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

三,实例。

3.1 浅度克隆

public class ProtoType  implements  Cloneable{

    //浅度克隆基础数据类型
    private  String name;
    private  String age;

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public ProtoType cloneObject(){
        try {
            //每一个对象的父类的都是Object, object 实现了clone(), 这里可以直接调用
            return (ProtoType)super.clone();
        } catch (CloneNotSupportedException e) {
            //没有实现(Cloneable)接口,会抛出不支持克隆异常,
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "ProtoType{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", peopleList=" + peopleList +
                '}';
    }
}
public class Test {

    public static void main(String[] args) {

        //具有相同的值,和结构 ,浅度克隆
        ProtoType protoType = new ProtoType();
        protoType.setName("张三");
        protoType.setAge("18");
        System.out.println("原型对象===" +protoType.toString());

        ProtoType protoType2 =  protoType.cloneObject();
        System.out.println("克隆对象===" +protoType.toString());

        System.out.println("原型对象=克隆对象:"+(protoType == protoType2));

     
    }
}

3.2 深度克隆对象

public class ProtoType  implements  Cloneable{

   
    private  String name;
    private  String age;

    /**
     * 深度克隆引用类型,使原型对象中的引用数据类型 与 模型对象中的引用数据类型 地址不一致
     */
    private List<String> peopleList;

    public List<String> getPeopleList() {
        return peopleList;
    }

    public void setPeopleList(List<String> peopleList) {
        this.peopleList = peopleList;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public ProtoType cloneObject(){
        try {
            //每一个类的父类的都是Object, object 实现了clone(), 这里可以直接调用
            ProtoType protoType =(ProtoType)super.clone();
            //深度克隆原型对象中的引用数据类型,其实就是创建一个新的对象,
            // 使原型对象中的引用数据类型 被克隆 模型对象时,让引用数据类型 地址不一致
            List<String> list = new ArrayList<String>();
            for(String str:this.peopleList){
                list.add(str);
            }
            protoType.setPeopleList(list);
            return protoType;
        } catch (CloneNotSupportedException e) {
            //没有实现(Cloneable)接口,会抛出不支持克隆异常,
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "ProtoType{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", peopleList=" + peopleList +
                '}';
    }
}
public class Test {

    public static void main(String[] args) {

        //深度克隆
        ProtoType protoType1 = new ProtoType();
        List<String> peopleList = new ArrayList<String>();
        peopleList.add("小王");
        peopleList.add("小李");

        protoType1.setPeopleList(peopleList);
        ProtoType protoType2 = protoType1.cloneObject();

        System.out.println(protoType1.getPeopleList());
        System.out.println(protoType2.getPeopleList());

        peopleList.add("小美");
        protoType1.setPeopleList(peopleList);
        System.out.println(protoType1.getPeopleList());
        System.out.println(protoType2.getPeopleList());
    }
}

总结:

在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据

希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互补影响)

隐藏克隆操作的细节,很多时候,对对象本身的克隆需要涉及到本身的数据细节

 

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可乐cc呀

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值