实战java设计模式(五)原型模式

1 介绍

用于创建重复的对象,同时又能保证性能。说白了,就是解决对象的复制问题,希望通过Object.clone()直接返回一个复制的对象,注意!!是深拷贝。

2 例子(实现Cloneable接口)

用一个学生类来做实验,学生类里面组合了一个课程。

2.1 课程类

//课程类
class Course implements Cloneable {
    private String courseName;
    private int score;

    //有参构造
    Course(String courseName, int score) {
        this.courseName = courseName;
        this.score = score;
    }
    //设置课程名字
    public void setCourseName(String name){
        this.courseName=name;
    }
    //克隆方法重写
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    //toString
    @Override
    public String toString() {
        return "("+this.courseName+":"+this.score+")";
    }
}

2.2 学生类

//学生类
class Student implements Cloneable {
    private String name;
    public Course course;
    //有参数构造
    Student(String stuName, String courseName, int score) {
        this.course = new Course(courseName, score);
        this.name = stuName;
    }
    //实现
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //首先克隆本类基础数据类型
        Student stuTemp = (Student) super.clone();
        //再将对象类型的克隆
        stuTemp.course = (Course) this.course.clone();//留下一个问题,为什么stuTemp.course是可见的
        return stuTemp;
    }
    //变成字符串
    @Override
    public String toString() {
        return "("+this.name+"->"+this.course.toString()+")";
    }
}

2.3 测试主类

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        //测试
        Student stu1 = new Student("小明", "语文", 85);
        Student stu2 = (Student) stu1.clone();

        //如果不加stuTemp.course = (Course) this.course.clone();结果又会如何
        stu2.course.setCourseName("化学");

        System.out.println(stu1.toString());
        System.out.println(stu2.toString());
    }
}

加与不加stuTemp.course = (Course) this.course.clone()结果会不一样,如果不加二者会共享同一个内存区域的course对象。修改stu2的同时也会修改stu1。

3 反序列化方法

3.1 课程类(可序列化即可)

//课程类
class Course implements Serializable {
    private String courseName;
    private int score;

    //有参构造
    Course(String courseName, int score) {
        this.courseName = courseName;
        this.score = score;
    }
    //设置课程名字
    public void setCourseName(String name){
        this.courseName=name;
    }

    //toString
    @Override
    public String toString() {
        return "("+this.courseName+":"+this.score+")";
    }
}

3.2 学生类

//学生类
class Student implements Serializable {
    private String name;
    public Course course;

    //有参数构造
    Student(String stuName, String courseName, int score) {
        this.course = new Course(courseName, score);
        this.name = stuName;
    }

    //实现
    @Override
    public Student clone() {
        Student student = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try{
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);
            oos.close();

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            student = (Student) ois.readObject();
            ois.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return student;
    }

    //变成字符串
    @Override
    public String toString() {
        return "("+this.name+"->"+this.course.toString()+")";
    }
}

4 总结

原型模式主要是Object.clone()方法来复制对象要写好。分别是实现Cloneable方法和反序列化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值