代码如下:
interface Monkey{
public void show();
public Monkey clone();
}
class Mon {
Mon(String name){
this.name=name;
}
Mon(Mon mp){
this.name=mp.name;
}
public Mon clone(){
return new Mon(this);
}
public String name;
}
class SunWuKong implements Monkey{
public Monkey clone(){
return new SunWuKong(this);
}
public void show(){
System.out.println(this.my_mon);
System.out.println(this.my_mon.name+"金箍棒");
}
SunWuKong(Mon mp){
this.my_mon=new Mon(mp.name);
//System.out.println(this.my_mon);
}
SunWuKong(SunWuKong sun){
this.my_mon=sun.my_mon.clone();
}
protected Mon my_mon;
}
public class Demo{
public static void main(String[]argv){
Mon m0=new Mon("孙");
Monkey mm=new SunWuKong(m0);
Monkey mm2=mm.clone();
Monkey mm3=mm.clone();
Monkey mm4=mm.clone();
mm.show();
mm2.show();
mm3.show();
mm4.show();
}
}
原型模式就是我们面对复杂的对象时,我们可以通过拷贝的方式简化我们的代码
思路:
1.抽象出一个带有拷贝自身的接口,和我们需要抽象出来的功能
2.创建实现抽象接口的类
这个时候我们需要写一个构造函数,能让我们创建出具体的实例对象
3.写能构造出成员的构造函数
接下来我们要写一个拷贝构造函数,用来我们实现拷贝结构的返回值
4.写拷贝构造函数,通过自身这个类构造出一个新的一模一样的类
注意:这个时候我们如果想构造出引用数据类型,就不能用浅拷贝,必须使用深拷贝
5.实现拷贝接口,返回自身的一个对象
这时候我们就实现了原型模式,只需要构造一次对象,接下来用拷贝的接口创建即可
类图如下:
深拷贝与浅拷贝详解
浅拷贝:a和b我们都是通过访问c的地址拿到里面的数据
也就是a和b共用访问一个内存段
如果说是引用数据类型,那么我们a释放内存,b再释放内存,显然b释放了已经释放的内存,显然我们不想这么做,我们就需要深拷贝
深拷贝:我们的a和b都动态内存分配,我们在 内存里面a和b都有属于自己的内存
这样我们释放资源时不会引发内存错误
class Mon {
Mon(String name){
this.name=name;
}
Mon(Mon mp){
this.name=mp.name;
}
public Mon clone(){
return new Mon(this);
}
public String name;
}
比如我们现在用的是Mon类,我们想进行拷贝时,我们就需要深拷贝
我们在构建Mon类时我们是new出来我们所需对象,通过我们的接口clone来返回