什么是原型模式?

1 个回答

  • 楚云飞
    用顺其自然态度过随遇而安的生活.
    # 原型模式 ## 定义 复制运行时的对象,克隆出一个一模一样的对象 ## 实现方式 ### 实现Cloneable接口 创建克隆对象 ``` package com.lglbc.protype.simple; public class Student implements Cloneable{ private String name; private String email; private String address; private Teacher teacher; public Student(String name, String email, String address) { this.name = name; this.email = email; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override protected Student clone() { try { return (Student)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", email='" + email + '\'' + ", address='" + address + '\'' + ", teacher=" + teacher + '}'; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } } ``` ``` package com.lglbc.protype.simple; public class Teacher implements Cloneable { private String name; public Teacher(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected Teacher clone(){ try { return (Teacher)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } @Override public String toString() { return "Teacher{" + "name='" + name + '\'' + '}'; } } ``` 测试 ``` package com.lglbc.protype.simple; public class Test { public static void main(String[] args) { Student student = new Student("a", "b", "c"); student.setTeacher(new Teacher("张老师")); System.out.println(student.toString()); Student cloneStudent = student.clone(); System.out.println(student.toString()); System.out.println(cloneStudent == student); cloneStudent.getTeacher().setName("杨老师"); System.out.println(student.toString()); } } ``` ### 深度克隆 #### 方式1 重写clone方法,依次调用成员变量的clone方法 ``` package com.lglbc.protype.deep; import java.io.Serializable; public class Student implements Cloneable, Serializable { private String name; private String email; private String address; private Teacher teacher; public Student(String name, String email, String address) { this.name = name; this.email = email; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override protected Student clone() { try { Student clone = (Student) super.clone(); Teacher teacher = clone.getTeacher().clone(); clone.setTeacher(teacher); return clone; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", email='" + email + '\'' + ", address='" + address + '\'' + ", teacher=" + teacher + '}'; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } } ``` ### 方式2 通过序列化和反序列化实现 ``` package com.lglbc.protype.deep.serializable; import java.io.*; public class Student implements Cloneable, Serializable { private String name; private String email; private String address; private Teacher teacher; public Student(String name, String email, String address) { this.name = name; this.email = email; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override protected Student clone() { ByteArrayOutputStream byteArrayOutputStream =null; ObjectOutputStream objectOutputStream =null; ByteArrayInputStream byteArrayInputStream =null; ObjectInputStream objectInputStream =null; try { byteArrayOutputStream = new ByteArrayOutputStream(); objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(this); byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); objectInputStream = new ObjectInputStream(byteArrayInputStream); Student student = (Student)objectInputStream.readObject(); return student; } catch (Exception e) { e.printStackTrace(); }finally { try { byteArrayOutputStream.close(); byteArrayInputStream.close(); objectOutputStream.close(); objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", email='" + email + '\'' + ", address='" + address + '\'' + ", teacher=" + teacher + '}'; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } } ``` BeanUtils,MapStruct
    发布于 2025-07-18 09:46 •IP属地 广东
    举报
    评论
    收藏