原型模式,顾名思义,以某个对象为原型创建和原型对象相同或相似的新对象。新的被创建的对象占用内存空间和原型对象不同。也就是说,它就是个全新的对象。
原型模式和单例模式区分一下,同样得到一个新对象,原型模式创建的是一个全新的对象,而单例模式拿到的一直是相同的一个对象。
原型模式分为浅克隆和深克隆两种方式。
浅克隆:当原型对象被复制时只复制值类型的成员变量,不复制引用类型的成员变量。
深克隆:无论原型对象是值类型和引用类型,都复制一份给克隆对象。
示例代码如下:
Prototype类:
public abstract class Prototype {
public abstract Prototype Clone();
}
ShallowClone(浅克隆)类:
public class ShallowClone extends Prototype{
private Member member;
private int i;
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public Prototype Clone() {
// TODO Auto-generated method stub
ShallowClone sc = new ShallowClone();
sc.i = 3;
sc.member = this.member;
return sc;
}
}
class Member{
}
深克隆:
public class DeepClone extends Prototype{
private Member member;
private int i;
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public Prototype Clone() {
// TODO Auto-generated method stub
DeepClone dc = new DeepClone();
dc.i = 2;
dc.member = new Member();
return dc;
}
}
public class Main {
public static void main(String[] args) {
//浅克隆
ShallowClone sc = new ShallowClone();
ShallowClone sc2 = (ShallowClone)sc.Clone();
System.out.println(sc == sc2);
System.out.println(sc.getI() == sc2.getI());
System.out.println(sc.getMember() == sc2.getMember());
//深克隆
DeepClone dc = new DeepClone();
DeepClone dc2 = (DeepClone)dc.Clone();
System.out.println(dc == dc2);
System.out.println(dc.getI() == dc2.getI());
System.out.println(dc.getMember() == dc2.getMember());
}
}
运行结果:
false
false
true
false
false
false
说明:
对象比较为false,说明不是一个对象,浅克隆Member相同,指向相同内存地址,值类型成员变量进行复制,可以独立变化不影响原对象。深克隆Member不同,指向不同内存地址,值类型也进行了复制,可以独立进行变化不影响原对象。
以上例子只是简单示例代码,希望能说明原型模式和两个克隆方式的思想,在JAVA或其他面向对象语言中都有其他好的代码对克隆进行控制或操作。
如有错误,欢迎指正
end