JAVA设计模式-原型模式

JAVA设计模式-原型模式

介绍

原型模式是一种创建型模式,用于创建重复的对象,并且保证性能。原型模式创建的对象是由原型对象自身创建的,是原型对象的一个克隆,和原型对象具有相同的结构和相同的值。

JAVA设计模式-原型模式

适用场景

  1. 创建对象时我们不仅仅需要创建一个新的对象,可能我们还需要对象创建出来里面的值和某一个对象也要完全一致,原型模式可以保证结构和值都相同。
  2. 创建对象时我们希望对创建出来的对象的修改不影响到原来的对象,可能通过原型模式进行创建,进行深度克隆。
  3. 创建对象时,如果对象是个复杂对象,里面又包含了其他的复杂对象,我们希望创建的对象和原有对象保持一致,传统模式new会非常麻烦,还需要考虑到里面其他的复杂对象,这时候可以使用原型模式进行创建。

参与者

  1. Prototype: 抽象原型类,是一个抽象类或者接口,并且声明一个克隆自身的接口。
  2. ConcretePrototype: 具体的原型类,需要实现抽象原型类里面的接口,在克隆自身的接口里面返回自己的一个克隆对象。
  3. Client: 客户端类,作用是让原型克隆自身来创建新的对象。

简单示例

Prototype类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.prototype
 * @Description: 抽象原型类
 * @Author: xpy
 * @Date: Created in 2022年09月23日 2:58 下午
 */
public interface Prototype {
    /**
     * 克隆自身的接口
     * @return
     */
    public Prototype clone();

    public String getName();

    public void setName(String name);
}

ConcretePrototype类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.prototype
 * @Description: 具体原型类
 * @Author: xpy
 * @Date: Created in 2022年09月22日 10:41 上午
 */
public class ConcreteProtype implements Prototype{

    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public Prototype clone() {
        ConcreteProtype concreteProtype = new ConcreteProtype();
        concreteProtype.setName(this.name);
        return concreteProtype;
    }
}

Client类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.prototype
 * @Description: 测试类
 * @Author: xpy
 * @Date: Created in 2022年09月22日 10:37 上午
 */
public class Client {
    public static void main(String[] args) {
        Prototype prototype = new ConcreteProtype();
        prototype.setName("测试1");
        Prototype prototypeClone = prototype.clone();
        System.out.println(prototype.getName());
        System.out.println(prototypeClone.getName());
    }
}

第二种写法

Java中所有类都是Object的子类,在Object类中提供了clone()方法,但是需要实现Cloneable接口,否则会抛出CloneNotSupportedException异常。

JAVA设计模式-原型模式

PrototypeTest类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.prototype
 * @Description: 实现Cloneable接口
 * @Author: xpy
 * @Date: Created in 2022年09月23日 4:28 下午
 */
public class PrototypeTest implements Cloneable{

    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    protected Object clone() {
        try{
            return super.clone();
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

ClientTest类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.prototype
 * @Description: 客户端测试类
 * @Author: xpy
 * @Date: Created in 2022年09月23日 4:30 下午
 */
public class ClientTest {
    public static void main(String[] args) {
        PrototypeTest prototypeTest = new PrototypeTest();
        prototypeTest.setName("测试1");
        PrototypeTest prototypeTestClone = (PrototypeTest) prototypeTest.clone();
        System.out.println(prototypeTest.getName());
        System.out.println(prototypeTestClone.getName());
    }
}

扩展

浅拷贝(浅度克隆)

浅拷贝只复制值,不复制引用的对象。

  1. 基本数据类型,浅拷贝会将值传递给新的对象。
  2. 引用数据类型,例如数组,类对象,浅拷贝会将数组、类对象的引用值,也就是存储的内存地址拷贝一份给新的对象,实际上两个对象指向的都是同一块内存空间,一个对象的修改会影响到另一个对象。
  3. 默认的clone方法是浅拷贝,super.clone()

JAVA设计模式-原型模式

深拷贝(深度克隆)

深拷贝会重新申请新的内存空间。

  1. 基本数据类型,深拷贝会克隆值给新的对象。
  2. 引用数据类型,深拷贝会重新申请新的内存空间,将原有对象指向的内存地址里面的数据全部拷贝到新的内存空间中。新对象指向的是新分配的内存空间的内存地址。新对象的修改不会影响到其他对象。
  3. 上述的clone方式是浅拷贝,需要重写默认的clone方法。

JAVA设计模式-原型模式

关注微信公众号「平哥技术站」, 每日更新,在手机上阅读所有教程,随时随地都能学习。

原文链接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi—yuan-xing-mo-shi

Original: https://www.cnblogs.com/aibianchengya/p/16735986.html
Author: 程序猿的代码
Title: JAVA设计模式-原型模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577820/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 解决requests.exceptions.SSLError:HTTPSConnectionPool

    解决requests.exceptions.SSLError:HTTPSConnectionPool 方案一 只要安装一下几个requests依赖包就可以解决此问题 pip ins…

    Linux 2023年6月14日
    097
  • Linux解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————….

    Linux 2023年6月13日
    079
  • Mac 睡眠唤醒 不睡眠 问题

    问题 之前一直有夜晚睡觉前电脑💻关机的习惯,主要是想着电脑也跟人一样♨️要休息😂。然后最近想着自己 Mac 干脆每天睡眠💤算了,省得每天开关机麻烦,所以就最近这段时间每次夜晚睡觉前…

    Linux 2023年6月7日
    092
  • centos 7 安装zabbix 4.0

    一、zabbix简介 1、简介 zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数如:…

    Linux 2023年6月7日
    0120
  • Nginx基础入门篇(1)—优势及安装

    一、Nginx 的优势 1.1发展趋势: 2016年: 1.2、简介 Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMA…

    Linux 2023年6月6日
    096
  • 七、软件包管理

    Linux软件管理分类: 1、rpm包管理 —– yum工具2、源码包管理RedhatCentosDebianUbuntu包名.rpm如何获取rpm包?互联…

    Linux 2023年6月7日
    0101
  • 机器学习学习笔记之三:朴素贝叶斯

    条件概率和贝叶斯公式 (p(x|y)) 表示在 (y) 发生的条件下 (x) 发生的概率。 条件概率公式:已知 (p(x)) 和 (p(y)),以及(x), (y)同时发生的概率(…

    Linux 2023年6月14日
    065
  • 面试题汇总

    JAVA 基础 1.java 性能优化 ①尽量指定类、方法的final 修饰符 ②尽量重用对象 ③尽可能使用局部变量 ④及时关闭流 ⑤尽量减少对变量的重复计算 ⑥尽量采用懒加载的策…

    Linux 2023年6月7日
    091
  • 【spring-boot】Redis的整合与使用详解

    在pom.xml中添加依赖 org.springframework.boot spring-boot-starter-data-redis 2.2.1.RELEASE io.let…

    Linux 2023年5月28日
    097
  • aspx.designer.cs没有自动生成代码(没有自动注册)

    遇到这个问题的最大可能是:aspx页面存在bug。 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自…

    Linux 2023年6月7日
    086
  • nodejs调用jar

    目前nodejs调用jar主要有两种方式: 通过创建子进程运行java -jar命令调用包含main方法的jar 使用node-java通过c++桥接调用jar 方法一(子进程运行…

    Linux 2023年6月14日
    091
  • JavaScript快速入门-04-运算符

    4 运算符 4.1 算术运算符 4.1.1 概述 JavaScript 提供的算术运算符如下所示: 类型 符号 示例 加法运算符 + a+b 减法运算符 – a-b 乘…

    Linux 2023年6月7日
    075
  • vue组件传值和路由——day04

    <script><br> var vm = new Vue({<br> el: ‘#app’,<br> data: {<br&…

    Linux 2023年6月7日
    099
  • 手把手教你设置MongoDB密码

    mongodb密码和传统数据如mysql等有些区别: mongodb的用户名和密码是基于特定数据库的,而不是基于整个系统的。所有所有数据库db都需要设置密码。 1. 查看所有数据库…

    Linux 2023年6月14日
    0103
  • WPF 解决 ObservableCollection 提示 Cannot change ObservableCollection during a CollectionChanged event 异常

    本文告诉大家在使用 ObservableCollection 时,抛出 InvalidOperationException 异常,提示 Cannot change Observab…

    Linux 2023年6月6日
    083
  • Pod控制器类型

    Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除…

    Linux 2023年6月6日
    0183
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球