设计模式之原型模式笔记

这篇具有很好参考价值的文章主要介绍了设计模式之原型模式笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

记录下学习设计模式-原型模式的写法。

Prototype(原型)

意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
结构:
设计模式之原型模式笔记

其中:

  • Prototype声明一个复制自身的接口。
  • ConcretePrototype实现一个复制自身的操作。
  • Client让一个原型复制自身从而创建一个新的对象。

适用性:

  • 当一个系统应该独立于它的产品创建、构成和表示时。
  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
  • 为了避免创建一个与产品类层次平行的工厂类层次时。
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

目录

设计模式之原型模式笔记

UML原型模式示例类图

设计模式之原型模式笔记

以该UML类图实现原型模式示例。

RealizeType类(浅克隆)

浅克隆:创建一个新对象,新对象的属性和原来完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
Java中的Object类提供了clone()方法来实现浅克隆。

package com.example.deesign_patterns.prototype.demo;

public class RealizeType implements Cloneable{

    //idea快捷键生成构造方法:alt+Ins键
    public RealizeType() {
        System.out.println("具体原型对象创建完成!");
    }

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

测试类

package com.example.deesign_patterns.prototype.demo;

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,说明不是同一个对象
    }
}

设计模式之原型模式笔记

原型模式案例

类图如下:
设计模式之原型模式笔记

奖状类

package com.example.deesign_patterns.prototype.demo2;

//奖状类
public class Citation implements Cloneable{

    //三好学生上的姓名
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

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


测试类

package com.example.deesign_patterns.prototype.demo2;

//测试类
public class CitationTest {

    public static void main(String[] args) throws CloneNotSupportedException {
        //1.创建原型对象
        Citation citation=new Citation();
        //2.克隆奖状对象
        Citation citation1=citation.clone();
        citation.setName("张三");
        citation1.setName("李四");
        //3.调用show方法
        citation.show();
        citation1.show();
    }
}

设计模式之原型模式笔记

扩展(深克隆)

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

学生类

package com.example.deesign_patterns.prototype.demo3;

import java.io.Serializable;

//学生类必须实现Serializable,不然会抛NotSerializableException异常
public class Student implements Serializable {

    //学生的姓名
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}


奖状类

package com.example.deesign_patterns.prototype.demo3;

import java.io.Serializable;

//奖状类必须实现Serializable,不然会抛NotSerializableException异常
public class Citation implements Cloneable, Serializable {

    //学生类
    private Student student;

    public Student getStudent() {
        return student;
    }

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

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

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

测试类

使用浅克隆结果如下:

package com.example.deesign_patterns.prototype.demo3;

//测试类
public class CitationTest {

    public static void main(String[] args) throws Exception {
        //1.创建原型对象
        Citation citation=new Citation();
        //创建张三学生对象
        Student student=new Student();
        student.setName("张三");
        citation.setStudent(student);

        //2.克隆奖状对象
        Citation citation1=citation.clone();
        citation1.getStudent().setName("李四");
        3.调用show方法
        citation.show();
        citation1.show();
    }
}

设计模式之原型模式笔记
使用深克隆结果如下:

package com.example.deesign_patterns.prototype.demo3;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

//测试类
public class CitationTest {

    public static void main(String[] args) throws Exception {
        //1.创建原型对象
        Citation citation=new Citation();
        //创建张三学生对象
        Student student=new Student();
        student.setName("张三");
        citation.setStudent(student);
		
		//使用对象流进行深克隆
        //创建对象输出流对象(文件目录随便写,如果没有会自动生成这个文件)
        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();

        //2.获取学生对象
        citation1.getStudent().setName("李四");
        //3.调用show方法
        citation.show();
        citation1.show();
    }
}


设计模式之原型模式笔记文章来源地址https://www.toymoban.com/news/detail-497411.html

到了这里,关于设计模式之原型模式笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式三(原型模式)

    在开发过程中,创建多个数据相同的对象,每次new都开销比较大,在这里可以使用对象克隆,以先创建的原型对象为模板进行对象的复制。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象

    2024年01月25日
    浏览(50)
  • 设计模式——原型模式

            原型模式就是有时我们需要多个类的实例,但是一个个创建,然后初始化,这样太麻烦了,此时可以使用克隆,来创建出克隆对象,就能大大的提高效率。具体就是要让此类实现Cloneable接口,然后重写Object类中的clone()方法。         具体实现就是克隆了,前面都有

    2024年02月14日
    浏览(43)
  • 设计模式系列-原型模式

    一、上篇回顾 上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的,但是每个对象的组装的过程来说可能是相对固定的或者说是

    2024年02月09日
    浏览(46)
  • 设计模式5:原型模式

    Prototype Pattern 如果对象的创建成本比较大,可以基于已有的原型对象通过来创建新的对象,节省创建时间。 设计模式之原型模式 实现Cloneable接口的方式。这里就不展开分析浅克隆和深克隆了,后面再专门分析浅克隆和深克隆,不影响对原型模式的理解。 用序列化实现创建对

    2024年02月11日
    浏览(54)
  • 设计模式-原型模式详解

    简介设计模式 设计模式是在软件开发中常见问题的解决方案,它们是经过实践和经验总结出来的可重用的设计思想和解决方案。设计模式通过提供通用的架构、原则和指导,帮助开发人员更有效地编写高质量的代码。 设计模式分为三个主要类别: 创建型模式:关注对象的创

    2024年02月10日
    浏览(36)
  • 设计模式 - 原型模式

    传统方式 优点: 比较好理解,简单易操作 缺点: 在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂 时,效率较低 总是需要重新初始化对象,而不是动态地获得对象运行时的状态, 不够灵活 原型模式 基本介绍: 原型模式(Prototype模式)是指:用原型

    2024年02月06日
    浏览(54)
  • 重温设计模式 --- 原型模式

    原型模式 是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。 在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们

    2024年02月13日
    浏览(51)
  • 【设计模式】原型模式

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例

    2024年02月13日
    浏览(47)
  • 设计模式-原型模式

    目录 一、传统方式 二、原型模式  三、浅拷贝和深拷贝 克隆羊问题: 现在有一只羊tom,姓名为: tom,年龄为: 1,颜色为: 白色,请编写程序创建和tom羊属性完全相同的10只羊。 传统的方式的优缺点: 简单易操作。优点是比较好理解。 在创建新的对象时,总是需要重新获取原

    2024年02月16日
    浏览(38)
  • 设计模式(6)原型模式

    一、介绍 Java中自带的原型模式是clone()方法。该方法是Object的方法,native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口,然后调用Object::clone方法就可实现克隆功能。这样实现的方式是浅拷贝。  1、

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包