23种涉及模式之原型模式

必须知道23种设计模式分为创建型,构造性,行为型

原型模式属于创建型

原型设计模式来解决什么问题?

原型模式主要用来解决复杂对象的创建,如何已经有了一个对象,我就可以通过可能的方式对它进行复制,可以避免很多没有必要的创建操作。

原型模式的克隆分为深克隆和浅克隆

深克隆的的话就是关于里面的属性是不会随着变,浅克隆的话属性会随着变动。

一下就是浅克隆代码

package com.chuan.DesignModel;

import java.util.Date;

public class PrototypeModel implements  Cloneable{
    String a;
    Date date;



    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        PrototypeModel prototypeModel = new PrototypeModel("aaa",date);
        //prototypeModel.date=date;
        System.out.println("prototypeModel--->"+prototypeModel.hashCode());
        System.out.println("prototypeModel--->"+prototypeModel);
        PrototypeModel prototypeModelNew = (PrototypeModel)prototypeModel.clone();
        prototypeModelNew.a="avc";
        System.out.println("prototypeModel--->"+prototypeModelNew.hashCode());
        System.out.println("prototypeModelNew--->"+prototypeModelNew);
        System.out.println("有关于原型模式基本上就以上这些!!!,我们可以看见属性和值都已经给复制了,并且他们是两个不同的对象!!!");
        System.out.println("这个时候我来改变Date的值!!!");
        date.setTime(1111);
        System.out.println("将修改Date后的值进行打印!!!");
        System.out.println("prototypeModel--->"+prototypeModel.hashCode());
        System.out.println("prototypeModel--->"+prototypeModel);
        System.out.println("prototypeModel--->"+prototypeModelNew.hashCode());
        System.out.println("prototypeModelNew--->"+prototypeModelNew);
        System.out.println("我们发现,改变之后,克隆出的对象,也会随着改变," +
                "这个时候我们想不需要它改变怎么办,我们可以进行对克隆方法进行改变!!!!");
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
       /* System.out.println("这里是进行深克隆!!!");
        PrototypeModel prototypeModel = (PrototypeModel)super.clone();
        prototypeModel.date= (Date) this.date.clone();
        return prototypeModel;*/
        return super.clone();
    }

    @Override
    public String toString() {
        return "PrototypeModel{" +
                "a='" + a + '\'' +
                ", date=" + date +
                '}';
    }

    public PrototypeModel(String a, Date date) {
        this.a = a;
        this.date = date;
    }
}

结果

C:\JDK\jdk\bin\java.exe “-javaagent:D:\idea\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=49275:D:\idea\IntelliJ IDEA 2019.1.2\bin” -Dfile.encoding=UTF-8 -classpath C:\JDK\jdk\jre\lib\charsets.jar;C:\JDK\jdk\jre\lib\deploy.jar;C:\JDK\jdk\jre\lib\ext\access-bridge-64.jar;C:\JDK\jdk\jre\lib\ext\cldrdata.jar;C:\JDK\jdk\jre\lib\ext\dnsns.jar;C:\JDK\jdk\jre\lib\ext\jaccess.jar;C:\JDK\jdk\jre\lib\ext\jfxrt.jar;C:\JDK\jdk\jre\lib\ext\localedata.jar;C:\JDK\jdk\jre\lib\ext\nashorn.jar;C:\JDK\jdk\jre\lib\ext\sunec.jar;C:\JDK\jdk\jre\lib\ext\sunjce_provider.jar;C:\JDK\jdk\jre\lib\ext\sunmscapi.jar;C:\JDK\jdk\jre\lib\ext\sunpkcs11.jar;C:\JDK\jdk\jre\lib\ext\zipfs.jar;C:\JDK\jdk\jre\lib\javaws.jar;C:\JDK\jdk\jre\lib\jce.jar;C:\JDK\jdk\jre\lib\jfr.jar;C:\JDK\jdk\jre\lib\jfxswt.jar;C:\JDK\jdk\jre\lib\jsse.jar;C:\JDK\jdk\jre\lib\management-agent.jar;C:\JDK\jdk\jre\lib\plugin.jar;C:\JDK\jdk\jre\lib\resources.jar;C:\JDK\jdk\jre\lib\rt.jar;E:\IdeaWorkSpase\mydemo\javase-one-xc\target\classes com.chuan.DesignModel.PrototypeModel
prototypeModel—>460141958
prototypeModel—>PrototypeModel{a=‘aaa’, date=Fri Apr 17 07:59:38 CST 2020}
prototypeModel—>21685669
prototypeModelNew—>PrototypeModel{a=‘avc’, date=Fri Apr 17 07:59:38 CST 2020}
有关于原型模式基本上就以上这些!!!,我们可以看见属性和值都已经给复制了,并且他们是两个不同的对象!!!
这个时候我来改变Date的值!!!
将修改Date后的值进行打印!!!
prototypeModel—>460141958
prototypeModel—>PrototypeModel{a=‘aaa’, date=Thu Jan 01 08:00:01 CST 1970}
prototypeModel—>21685669
prototypeModelNew—>PrototypeModel{a=‘avc’, date=Thu Jan 01 08:00:01 CST 1970}
我们发现,改变之后,克隆出的对象,也会随着改变,这个时候我们想不需要它改变怎么办,我们可以进行对克隆方法进行改变!!!!

Process finished with exit code 0
由上所述虽然Date改变了,但是我们不想让克隆后的对象也随着改变,因为此时两个都值向Date,所以Date改变,两个都改变。

一下是深克隆代码

package com.chuan.DesignModel;

import java.util.Date;

public class PrototypeModel implements  Cloneable{
    String a;
    Date date;



    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        PrototypeModel prototypeModel = new PrototypeModel("aaa",date);
        //prototypeModel.date=date;
        System.out.println("prototypeModel--->"+prototypeModel.hashCode());
        System.out.println("prototypeModel--->"+prototypeModel);
        PrototypeModel prototypeModelNew = (PrototypeModel)prototypeModel.clone();
        prototypeModelNew.a="avc";
        System.out.println("prototypeModel--->"+prototypeModelNew.hashCode());
        System.out.println("prototypeModelNew--->"+prototypeModelNew);
        System.out.println("有关于原型模式基本上就以上这些!!!,我们可以看见属性和值都已经给复制了,并且他们是两个不同的对象!!!");
        System.out.println("这个时候我来改变Date的值!!!");
        date.setTime(1111);
        System.out.println("将修改Date后的值进行打印!!!");
        System.out.println("prototypeModel--->"+prototypeModel.hashCode());
        System.out.println("prototypeModel--->"+prototypeModel);
        System.out.println("prototypeModel--->"+prototypeModelNew.hashCode());
        System.out.println("prototypeModelNew--->"+prototypeModelNew);
        System.out.println("我们发现,改变之后,克隆出的对象,也会随着改变," +
                "这个时候我们想不需要它改变怎么办,我们可以进行对克隆方法进行改变!!!!");
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
       System.out.println("这里是进行深克隆!!!");
        PrototypeModel prototypeModel = (PrototypeModel)super.clone();
        prototypeModel.date= (Date) this.date.clone();
        return prototypeModel;
       // return super.clone();
    }

    @Override
    public String toString() {
        return "PrototypeModel{" +
                "a='" + a + '\'' +
                ", date=" + date +
                '}';
    }

    public PrototypeModel(String a, Date date) {
        this.a = a;
        this.date = date;
    }
}

结果

C:\JDK\jdk\bin\java.exe “-javaagent:D:\idea\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=49685:D:\idea\IntelliJ IDEA 2019.1.2\bin” -Dfile.encoding=UTF-8 -classpath C:\JDK\jdk\jre\lib\charsets.jar;C:\JDK\jdk\jre\lib\deploy.jar;C:\JDK\jdk\jre\lib\ext\access-bridge-64.jar;C:\JDK\jdk\jre\lib\ext\cldrdata.jar;C:\JDK\jdk\jre\lib\ext\dnsns.jar;C:\JDK\jdk\jre\lib\ext\jaccess.jar;C:\JDK\jdk\jre\lib\ext\jfxrt.jar;C:\JDK\jdk\jre\lib\ext\localedata.jar;C:\JDK\jdk\jre\lib\ext\nashorn.jar;C:\JDK\jdk\jre\lib\ext\sunec.jar;C:\JDK\jdk\jre\lib\ext\sunjce_provider.jar;C:\JDK\jdk\jre\lib\ext\sunmscapi.jar;C:\JDK\jdk\jre\lib\ext\sunpkcs11.jar;C:\JDK\jdk\jre\lib\ext\zipfs.jar;C:\JDK\jdk\jre\lib\javaws.jar;C:\JDK\jdk\jre\lib\jce.jar;C:\JDK\jdk\jre\lib\jfr.jar;C:\JDK\jdk\jre\lib\jfxswt.jar;C:\JDK\jdk\jre\lib\jsse.jar;C:\JDK\jdk\jre\lib\management-agent.jar;C:\JDK\jdk\jre\lib\plugin.jar;C:\JDK\jdk\jre\lib\resources.jar;C:\JDK\jdk\jre\lib\rt.jar;E:\IdeaWorkSpase\mydemo\javase-one-xc\target\classes com.chuan.DesignModel.PrototypeModel
prototypeModel—>460141958
prototypeModel—>PrototypeModel{a=‘aaa’, date=Fri Apr 17 08:02:24 CST 2020}
这里是进行深克隆!!!
prototypeModel—>21685669
prototypeModelNew—>PrototypeModel{a=‘avc’, date=Fri Apr 17 08:02:24 CST 2020}
有关于原型模式基本上就以上这些!!!,我们可以看见属性和值都已经给复制了,并且他们是两个不同的对象!!!
这个时候我来改变Date的值!!!
将修改Date后的值进行打印!!!
prototypeModel—>460141958
prototypeModel—>PrototypeModel{a=‘aaa’, date=Thu Jan 01 08:00:01 CST 1970}
prototypeModel—>21685669
prototypeModelNew—>PrototypeModel{a=‘avc’, date=Fri Apr 17 08:02:24 CST 2020}
我们发现,改变之后,克隆出的对象,也会随着改变,这个时候我们想不需要它改变怎么办,我们可以进行对克隆方法进行改变!!!!
Process finished with exit code 0

我们会发现克隆后的对象不对随着,Date改变而改变
以上就是可能模式,希望指正

这里面记住两个东西一个Cloneable,clone()。Cloneable中重写了,Object的clone(),并且是本地方法,所有这个操作比较快,prototype模式。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值