【Java 设计模式】创建型之原型模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 4. 应用示例
    • 结语

在软件开发中,原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道其具体实现。原型模式通常包含一个原型接口和多个实现了该接口的具体原型类。在本文中,我们将介绍 Java 设计模式中的原型模式,了解其定义、使用场景以及如何在实际开发中应用。

1. 定义

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道其具体实现。在原型模式中,一个原型接口定义了一个克隆方法,而具体原型类实现了该克隆方法,从而允许通过复制现有对象的方法来创建新对象。

2. 应用场景

原型模式的应用场景包括但不限于以下情况:

  • 对象创建成本高昂:

    当对象的创建成本较高,而且新对象的创建过程与已有对象相似时,使用原型模式可以通过复制现有对象来降低创建成本

  • 避免构造器执行:

    当对象的构造器执行代价较高,但新对象的创建过程可以通过复制现有对象完成时,使用原型模式可以避免执行构造器

  • 隐藏具体实现:

    客户端不需要知道对象的具体实现类,只需要知道原型接口即可。这有助于降低客户端与具体类之间的耦合

3. 代码实现

原型模式的实现主要涉及以下两个角色:

在这里插入图片描述

  • 原型接口(Prototype): 定义了克隆方法的接口
  • 具体原型类(ConcretePrototype): 实现了原型接口的具体类,负责实现克隆方法

下面是一个简单的原型模式的实现示例:

1)原型接口 Prototype

Prototype.java

package com.cheney.demo;

interface Prototype {
    Prototype clone();
}

2)具体原型类 ConcretePrototype

ConcretePrototype.java

package com.cheney.demo;

class ConcretePrototype implements Prototype {
    private String context;

    public ConcretePrototype(String context) {
        this.context = context;
    }

    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.context);
    }

    public String getContext() {
        return context;
    }

    public void setData(String data) {
        this.context = data;
    }
}

在上述示例中,Prototype 是原型接口,定义了克隆方法。ConcretePrototype 是具体原型类,实现了原型接口的克隆方法。

4. 应用示例

假设我们创建了一个经典的汉堡包,然后需要特殊人的口味复制它,再加入特殊配料。我们可以使用原型模式来创建图形对象的副本。

1)原型接口 Prototype

Prototype.java

package com.cheney.demo;

interface Prototype {
    Prototype clone();
}

2)汉堡包原型接口 HamburgerPrototype

HamburgerPrototype.java

package com.cheney.demo;

interface HamburgerPrototype extends Prototype {
    HamburgerPrototype clone();
    void addIngredient(String ingredient);
    void displayIngredients();
}

3)基础汉堡包原型 CheeseHamburgerPrototype

CheeseHamburgerPrototype.java

package com.cheney.demo;

import java.util.ArrayList;
import java.util.List;

class CheeseHamburgerPrototype implements HamburgerPrototype {
    private final String name;
    private final List<String> ingredients;

    public CheeseHamburgerPrototype(String name) {
        this.name = name;
        this.ingredients = new ArrayList<>();
    }

    private CheeseHamburgerPrototype(CheeseHamburgerPrototype source) {
        this.name = source.name;
        this.ingredients = new ArrayList<>(source.ingredients);
    }

    @Override
    public HamburgerPrototype clone() {
        return new CheeseHamburgerPrototype(this);
    }

    @Override
    public void addIngredient(String ingredient) {
        this.ingredients.add(ingredient);
    }

    @Override
    public void displayIngredients() {
        System.out.println("汉堡包名字: " + name);
        System.out.println("配料: " + String.join(", ", ingredients));
    }
}

在上述示例中,HamburgerPrototype 是图形接口,继承了原型接口 Prototype,定义了克隆方法,和配料的添加及打印。CheeseHamburgerPrototype 是经典汉堡包类,实现了汉堡包制作接口的克隆方法和配料的添加及打印方法。

4)制作汉堡包

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 创建汉堡包原型对象
        HamburgerPrototype originalHamburger = new CheeseHamburgerPrototype("经典汉堡包");

        // 添加汉堡包原型的配料
        originalHamburger.addIngredient("牛肉饼");
        originalHamburger.addIngredient("芝士");
        originalHamburger.addIngredient("西红柿片");

        // 克隆汉堡包
        HamburgerPrototype clonedHamburger = originalHamburger.clone();

        // 添加克隆对象的配料
        clonedHamburger.addIngredient("番茄酱");

        // 显示原型和克隆对象的配料
        originalHamburger.displayIngredients();
        System.out.println(">>>>>>>>>>>>>>>> 克隆后的:>>>>>>>>>>>>>>>>");
        clonedHamburger.displayIngredients();
    }
}

执行结果

在这里插入图片描述

在上述示例中,我们创建了一个具体原型对象 originalHamburger,然后通过调用 clone 方法来克隆对象,得到一个新的对象 clonedHamburger。最后,我们分别调用原型和克隆对象的 displayIngredients 方法来打印配料。

结语

原型模式是一种灵活且实用的设计模式,通过合理使用,可以提高系统的扩展性和性能。在实际开发中,可以根据需求选择适当的原型模式实现,确保系统具有良好的可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/330284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

循环神经网络的变体模型-LSTM、GRU

一.LSTM&#xff08;长短时记忆网络&#xff09; 1.1基本介绍 长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;是一种深度学习模型&#xff0c;属于循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;的一种变体。…

鸿蒙开发(四)UIAbility和Page交互

通过上一篇的学习&#xff0c;相信大家对UIAbility已经有了初步的认知。在上篇中&#xff0c;我们最后实现了一个小demo&#xff0c;从一个UIAbility调起了另外一个UIAbility。当时我提到过&#xff0c;暂不实现比如点击EntryAbility中的控件去触发跳转&#xff0c;而是在Entry…

自动驾驶预测-决策-规划-控制学习(5):图像分割与语义分割入门

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 论文题目&#xff1a;Evolution of Image Segmentation using Deep Convolutional Neural Network: A Survey前言&#xff1a;图像分割与语义分割一、图像分割是什么…

vue3 实现简单计数器示例——一个html文件展示vue3的效果

目的&#xff1a;作为一个新手开发&#xff0c;我想使用 Vue 3 将代码封装在 HTML 文件中时&#xff0c;进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&…

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录 一&#xff1a;GPIO输入输出原理二&#xff1a;GPIO基本结构三&#xff1a;GPIO位结构四&#xff1a;GPIO的八种模式道友&#xff1a;相信别人&#xff0c;更要一百倍地相信自己。 &#xff08;推荐先看文章&#xff1a;《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

宏集干货丨探索物联网HMI的端口转发和NAT功能

来源&#xff1a;宏集科技 工业物联网 宏集干货丨探索物联网HMI的端口转发和NAT功能 原文链接&#xff1a;https://mp.weixin.qq.com/s/zF2OqkiGnIME6sov55cGTQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #工业自动化 #工业物联网 #HMI 前 言 端口转发和NAT功…

Qt纯代码实现UI界面

1.相关信息 设置编辑框内容的字体样式&#xff0c;包括加粗、下划线、斜体、蓝色、红色、黑色 2.界面展示 3.相关代码 #include "dialog.h" #include <QHBoxLayout> #include <QVBoxLayout> #include <QCheckBox> #include <QRadioButton> …

【软件测试学习笔记6】Linux常用命令

格式 command [-options] [parameter] command 表示的是命令的名称 []表示是可选的&#xff0c;可有可无 [-options]&#xff1a;表示的是命令的选项&#xff0c;可有一个或多个&#xff0c;也可以没有 [parameter]&#xff1a;表示命令的参数&#xff0c;可以有一个或多…

清晰光谱空间:全自动可调波长系统的高光谱成像优势

高光谱成像技术 高光谱成像技术是一种捕获和分析宽波长信息的技术&#xff0c;能够对材料和特征进行详细的光谱分析和识别。高光谱成像技术的实现通过高光谱相机&#xff0c;其工作原理是使用多个光学传感器或光学滤波器分离不同波长的光&#xff0c;并捕获每个波段的图像&…

前端:布局(用于div中有多行元素,一行只显示四个,最左或最右要紧贴父div,最顶层和最底层也要紧贴父div)

效果 一、flex实现 html <!DOCTYPE html> <html><head><title>Flexbox Layout</title><style>.container {display: flex;flex-wrap: wrap;justify-content: space-between;gap: 10px;border: 1px solid red;}.box {flex: 1 0 calc(25% …

rsync全面讲解

rsync 是一个常用的 Linux 应用程序&#xff0c;用于文件同步。 它可以在本地计算机与远程计算机之间&#xff0c;或者两个本地目录之间同步文件&#xff08;但不支持两台远程计算机之间的同步&#xff09;。它也可以当作文件复制工具&#xff0c;替代cp和mv命令。 它名称里面…

逆向使用webpack打包的网站

webpack webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源&#xff08;图片、js文件、css文件等&#xff09;都看成模块&#xff0c;通过loader&#xff08;加载器&#xff09;和 plugins &#xff08;插件&#xff09;对资源进行处理&#xff0c;打包成符…

JRTP实时音视频传输(2)-使用TCP通信的案例

1.创建自己的demo 先将example1拷贝为myclienttcp.cpp和myservertcp.cpp cp example1.cpp myclienttcp.cpp cp example1.cpp myservertcp.cpp 改写jrtplib/JRTPLIB/examples/CMakeLists.txt&#xff0c;添加myclienttcp和myservertcp编译 重新生成Makefile并编译 sudo cmak…

plc红绿灯程序

引言&#xff1a; PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制器&#xff09;是一种用于工业自动化控制的电子设备。西门子的SIMATIC S7-200是这类设备的一个流行系列&#xff0c;广泛应用于小型至中等规模的自动化项目中。它具有以下特点&#…

pytorch学习(一)线性模型

文章目录 线性模型 pytorch是一个基础的python的科学计算库&#xff0c;它有以下特点&#xff1a; 类似于numpy&#xff0c;但是它可以使用GPU可以用它来定义深度学习模型&#xff0c;可以灵活的进行深度学习模型的训练和使用 线性模型 线性模型的基本形式为&#xff1a; f ( x…

推荐一款性价比高的USB 协议分析仪

最近在入门学习USB 协议&#xff0c;USB 协议是出了名的晦涩难懂&#xff0c;调试过程中如果没有合适的工具帮助分析&#xff0c;就像电工没有电表笔一样&#xff0c;难以诊断各种奇难杂症。 于是网上找了一下USB 协议分析仪&#xff0c;一看价格超过3位数的就不考虑了&#x…

Java关键字static和final

一、final关键字是什么&#xff1f; 1、final可以用来修饰的结构&#xff1a;类、方法、变量 2、final用来修饰一个类&#xff1a;此类不能被其它类继承。当我们需要让一个类永远不被继承&#xff0c;此时就可以用final修饰&#xff0c;但要注意&#xff1a;final类中所有的成…

ArcGIS Pro 如何新建布局

你是否已经习惯了在ArcGIS中数据视图和布局视图之间来回切换&#xff0c;到了ArcGIS Pro中却找不到二者之间切换的按钮&#xff0c;即使新建布局后却发现地图怎么却是一片空白。 这一切的一切都是因为ArcGIS Pro的功能框架完全不同&#xff0c;这里为大家介绍一下在ArcGIS Pro…

微信小程序(五)下拉刷新

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1. 下拉刷新 2. 下拉页面背景颜色 3. 设置是否可滚动 4. 设置导航栏模式 源码&#xff1a;(实际上不能加注释但这里为了方便解释就加上了) index.json {//默认模式&#xff0c;另一种自定义模式是custom//自定义…

课表排课小程序怎么制作?多少钱?

在当今的数字化时代&#xff0c;无论是购物、支付、点餐&#xff0c;还是工作、学习&#xff0c;都离不开各种各样的微信小程序。其中&#xff0c;课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢&#xff1f;又需要多少钱呢&#xff1f; …