ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

创建者模式--原型模式

2022-08-30 15:31:33  阅读:205  来源: 互联网

标签:创建者 -- clone Citation 模式 对象 原型 new public


概述

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

结构

原型模式包含如下角色:

  • 抽象原型类: 规定了具体原型对象必须实现的clone()方法
  • 具体原型类: 实现抽象原型类的clone()方法,他是可被复制的对象
  • 访问类: 使用具体原型类中的clone()方法来复制新的对象

类图:

 实现

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

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

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有