其他分享
首页 > 其他分享> > 创建者模式--原型模式

创建者模式--原型模式

作者:互联网

概述

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

结构

原型模式包含如下角色:

类图:

 实现

原型模式的克隆分为浅克隆和深克隆

浅克隆:创建一个对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不在指向原有对象地址

java中Object类中提供了clone()方法来实现浅克隆,Cloneable接口是上面类图中的抽象原型类,而实现了Cloneable接口的子实现类就是具体的原型类.代码如下

public class Realizetype implements Cloneable{

    public Realizetype() {
        System.out.println("具体的原型对象创建成功!");
    }

    @Override
    protected Realizetype clone() throws CloneNotSupportedException {
        System.out.println("具体原型复制成功");
        return (Realizetype)super.clone();
    }
}

    public static void main(String[] args) throws CloneNotSupportedException {
        Realizetype realizetype = new Realizetype();
        Realizetype clone = realizetype.clone();
        System.out.println("原型对象和克隆对象是不是同一个对象:" + (realizetype == clone));
    }

 案例

用原型模式生成"三好学生"奖状

同一学校三好学生奖状除了获奖人名不同,其他都相同,可以使用原型模式复制多个三好学生奖状出来,然后修改奖状的名字即可

类图:

 

 

 

@Data
public class Citation implements Cloneable{

    private String name;

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

    public void show(){
        System.out.println(name + "同学:在2022第一学期中表现优秀,特发此奖");
    }
}

class Client{
    public static void main(String[] args) throws CloneNotSupportedException {
        Citation citation = new Citation();
        Citation clone = citation.clone();

        citation.setName("张三");
        clone.setName("李四");

        citation.show();
        clone.show();
    }
}

 

 

 使用场景

拓展(深克隆)

@Data
public class Citation implements Cloneable, Serializable {

    private Student student;

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

    public void show() {
        System.out.println(student.getName() + "同学:在2022第一学期中表现优秀,特发此奖");
    }
}

@Data
class Student implements Serializable {

    private String name;
}

class Client {
    public static void main(String[] args) throws Exception {
        Citation citation = new Citation();

        Student student = new Student();
        student.setName("张三");
        citation.setStudent(student);
        //创建对象输出流对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\data\\a.txt"));
        //写对象
        oos.writeObject(citation);
        //关闭资源
        oos.close();

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

        Student student1 = citation1.getStudent();
        student.setName("李四");

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

 

注意:都需要实现Serializable接口

 

标签:创建者,--,clone,Citation,模式,对象,原型,new,public
来源: https://www.cnblogs.com/lpzjava/p/16639447.html