Uso del patrón de prototipo

1. El uso del modo prototipo

1.1 Introducción

Use una instancia ya creada como prototipo y cree un nuevo objeto idéntico al objeto prototipo copiando el objeto prototipo .

1.2 Estructura

  • Clase de prototipo abstracto : especifica el método clone() que debe implementar el objeto prototipo concreto.
  • Clase prototipo concreta : implementa el método clone() de la clase prototipo abstracta, que es un objeto que se puede copiar.
  • Clase de acceso : utilice el método clone() en la clase prototipo concreta para copiar el nuevo objeto.

1.3 Diagrama de clase de patrón de prototipo

La clase Object en Java proporciona clone()métodos para implementar la clonación superficial . La interfaz Cloneable es una clase prototipo abstracta en el diagrama de clases, y la clase de subimplementación que implementa la interfaz Cloneable es una clase prototipo concreta.

inserte la descripción de la imagen aquí

1.4 Implementación

1.4.1 Clasificación de clones

La clonación en modo prototipo se divide en clonación superficial y clonación profunda.

Clon superficial: crea un nuevo objeto, las propiedades del nuevo objeto son exactamente las mismas que las del objeto original, y para las propiedades de tipo no básico, todavía apunta a la dirección de memoria del objeto señalado por la propiedad original.

Clon profundo: cuando se crea un nuevo objeto, otros objetos a los que se hace referencia en el atributo también se clonarán y ya no apuntarán a la dirección del objeto original.

1.4.2 Código

/**
 * 具体原型类: Realizetype
 */
public class Realizetype implements Cloneable{
    
    
    // 无参构造函数,创建对象时运行里面的代码
    public Realizetype() {
    
    
        System.out.println("具体的原型对象创建完成");
    }
    @Override
    public Realizetype clone() throws CloneNotSupportedException {
    
    
        System.out.println("具体原型复制成功");
        // Object类中提供了clone()方法来实现浅克隆,强转为Realizetype
        return (Realizetype) super.clone();
    }
}

/**
 * 访问类: client
 */
public class client{
    
    
    public static void main(String[] args) throws CloneNotSupportedException {
    
    
        // 创建一个原型类的对象
        Realizetype realizetype = new Realizetype();
        // 调用Realizetype类中的clone方法进行对象的克隆
        Realizetype clone = realizetype.clone();
        System.out.println("原型对象和克隆出来的对象是否为一个对象:" + (realizetype == clone));// false
    }
}

1.5 Casos de Premio "Tres Buenos Estudiantes"

1.5.1 Diagrama de clase del premio "Tres buenos estudiantes"

Los certificados de "Tres buenos estudiantes" de la misma escuela son los mismos excepto por los nombres de los ganadores. Puede usar el modo prototipo para copiar varios certificados de "Tres buenos estudiantes" y luego modificar los nombres en los certificados.

inserte la descripción de la imagen aquí

1.5.2 Código

/**
 * 学生实体类: Student
 */
public class Student {
    
    
    // 学生姓名
    private String name;

    public Student() {
    
    
    }

    public Student(String name) {
    
    
        this.name = name;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
    
    
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
    
    
        this.name = name;
    }
    
    public String toString() {
    
    
        return "Student{name = " + name + "}";
    }
}

/**
 * 具体原型类: Citation
 */
public class Citation implements Cloneable {
    
    
    private Student stu;

    public Student getStudent(){
    
    
        return stu;
    }

    public void setStudent(Student stu){
    
    
        this.stu = stu;
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
    
    
        return (Citation) super.clone();
    }

    public void show() {
    
    
        System.out.println(stu.getName() + "同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!");
    }
}

/**
 * 访问类: CitaionTest
 */
public class CitaionTest {
    
    
    public static void main(String[] args) throws CloneNotSupportedException {
    
    
        // 创建原型对象
        Citation citation = new Citation();
        // 创建张三学生对象
        Student stu = new Student();
        stu.setName("张三");
        citation.setStudent(stu);

        // 克隆奖状对象
        Citation citation1 = citation.clone();
        // 避免浅克隆的问题,重新声明一个对象
        Student stu1 = new Student();
        stu1.setName("李四");
        citation1.setStudent(stu1);

        // 调用show方法展示
        citation.show();
        citation1.show();
    }
}

1.6 Distinguir entre clones profundos y superficiales

1.6.1 Clon superficial

Cree un nuevo objeto, los atributos del nuevo objeto son exactamente los mismos que los del objeto original , y para los atributos de tipo no básico, aún apunta a la dirección de memoria del objeto al que apunta el atributo original. El objeto stu y el objeto stu1 son el mismo objeto, por lo que el valor del atributo de nombre en el objeto stu1 se cambiará a "Li Si" y los dos objetos Citation (certificado) mostrarán Li Si. Este es el efecto de la clonación superficial, copiando los atributos del tipo de referencia en la clase prototipo concreta (Cita) .

/**
 * 学生实体类: Student
 */
public class Student {
    
    
    // 学生姓名
    private String name;

    public Student() {
    
    
    }

    public Student(String name) {
    
    
        this.name = name;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
    
    
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
    
    
        this.name = name;
    }
    
    public String toString() {
    
    
        return "Student{name = " + name + "}";
    }
}

/**
 * 具体原型类: Citation
 */
public class Citation implements Cloneable {
    
    
    private Student stu;

    public Student getStudent(){
    
    
        return stu;
    }

    public void setStudent(Student stu){
    
    
        this.stu = stu;
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
    
    
        return (Citation) super.clone();
    }

    public void show() {
    
    
        System.out.println(stu.getName() + "同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!");
    }
}

/**
 * 访问类: CitaionTest
 */
public class CitaionTest {
    
    
    public static void main(String[] args) throws CloneNotSupportedException {
    
    
        // 创建原型对象
        Citation citation = new Citation();
        // 创建张三学生对象
        Student stu = new Student();
        stu.setName("张三");
        citation.setStudent(stu);
        // 克隆奖状对象
        Citation citation1 = citation.clone();
        Student stu1 = citation1.getStudent();
        stu1.setName("李四");

        //3,调用show方法展示
        citation.show();//李四同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!
        citation1.show();//李四同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!
    }
}

1.6.2 Clonación profunda

Cuando se crea un nuevo objeto, otros objetos a los que se hace referencia en el atributo también se clonarán y ya no apuntarán a la dirección del objeto original. La clonación profunda debe implementarse utilizando flujos de objetos .

Nota: La clase Citation y la clase Student deben implementar la interfaz Serializable, de lo contrario, se generará una NotSerializableException.

/**
 * 学生实体类: Student
 */
public class Student implements Serializable {
    
    
    // 学生姓名
    private String name;

    public Student() {
    
    
    }

    public Student(String name) {
    
    
        this.name = name;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
    
    
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
    
    
        this.name = name;
    }
    
    public String toString() {
    
    
        return "Student{name = " + name + "}";
    }
}

/**
 * 具体原型类: Citation
 */
public class Citation implements Cloneable,Serializable {
    
    
    private Student stu;

    public Student getStudent(){
    
    
        return stu;
    }

    public void setStudent(Student stu){
    
    
        this.stu = stu;
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
    
    
        return (Citation) super.clone();
    }

    public void show() {
    
    
        System.out.println(stu.getName() + "同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!");
    }
}

/**
 * 访问类: CitaionTest
 */
public class CitaionTest {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 创建原型对象
        Citation citation = new Citation();
        // 创建张三学生对象
        Student stu = new Student();
        stu.setName("张三");
        citation.setStu(stu);

        // 创建对象输出流对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://a.txt"));
        // 写对象
        oos.writeObject(citation);
        // 释放资源
        oos.close();

        // 创建对象输入流对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://a.txt"));
        // 读取对象
        Citation citation1 = (Citation) ois.readObject();
        // 释放资源
        ois.close();
        Student stu1 = citation1.getStu();
        stu1.setName("李四");

        citation.show();
        citation1.show();
    }
}

记录每一个学习瞬间

Supongo que te gusta

Origin blog.csdn.net/qq_51601665/article/details/131071684
Recomendado
Clasificación