必须知道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模式。。。。