GOF之原型模式

简介

        用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。

角色分析

        抽象原型类:规定了具体原型对象必须实现的接口。

        具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。

        访问类:使用具体原型类中的 clone() 方法来复制新的对象。

代码实现

//浅克隆 非基本类型属性,仍指向原有属性所指向的对象的内存地址

class User implements Cloneable {
    User () {
        System.out.println("具体原型创建");
    }

    public Object clone() throws CloneNotSupportedException {
        System.out.println("复制");

        return (Realizetype) super.clone();
    }
}

//测试
public class App {
    public static void main(String[] args) throws CloneNotSupportedException {
        User user1 = new User ();
        User user2= (User ) user1.clone();

        System.out.println("user1==user2?" + (user1 == user2));
    }
}
//深克隆1
class User implements Cloneable {
    Desk desk;

    public User clone() throws CloneNotSupportedException {
        User userclone = (User ) super.clone();

        Desk desk = new Desk();

        desk.setShape(userclone.desk.getShape());

        userclone.setDesk(desk);

        return userclone ;
    }
}

public class Desk  {
    String shape;

    public Desk(String shape) {
        this.shape = shape;
    }
}

//测试
public class App {
    public static void main(String[] args) throws CloneNotSupportedException {
        User user = new User (new Desk("圆桌"));
        User userclone = user.clone();
    }
}
//深克隆2
class User implements Cloneable {
    Desk desk;

    public User clone() throws CloneNotSupportedException {
        User userclone = (User ) super.clone();

        Desk desk = (Desk) this.desk.clone();//克隆一个desk

        userclone.setDesk(desk);

        return userclone ;
    }
}

public class Desk implements Cloneable {
    String shape;

    public Desk(String shape) {
        this.shape = shape;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

//测试
public class App {
    public static void main(String[] args) throws CloneNotSupportedException {
        User user = new User (new Desk("圆桌"));
        User userclone = user.clone();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值