深度学习模板方法设计模式

news2024/12/24 20:32:20

文章目录

  • 前言
  • 一、介绍
  • 二、特点
  • 三、详细介绍
    • 1.核心组成
    • 2.代码示例
    • 3.优缺点
      • 优点
      • 缺点
    • 4.使用场景
  • 总结


前言

模板方法设计模式是行为型设计模式,主要是定义算法框架,并将一些步骤的实现延迟到子类,重新定义算法的步骤。


一、介绍

模板设计模式(Template Pattern)是一种行为型设计模式,它在超类中定义了一个算法的框架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法的某些特定步骤。

二、特点

模板方法设计模式主要有以下特点:

  • 算法框架:在超类中定义一个或多个模板方法,这些方法定义了算法的骨架,但具体的实现步骤可以延迟到子类中。
  • 钩子方法:在超类中定义的方法,可以被子类覆盖,以提供特定的行为。
  • 抽象方法:在超类中定义的方法,子类必须实现这些方法。
  • 具体方法:在超类中定义的方法,子类可以继承并使用这些方法,也可以覆盖它们。
  • 扩展性:模板设计模式提高了代码的扩展性,允许在子类中扩展或修改算法的特定步骤。
  • 灵活性:通过模板方法,可以在运行时动态地改变算法的行为。

三、详细介绍

1.核心组成

  • AbstractClass(抽象类):定义了模板方法和钩子方法,以及可能的抽象方法和具体方法。
  • ConcreteClass(具体类):继承自抽象类,实现抽象方法,并可能覆盖钩子方法和具体方法。

在这里插入图片描述

2.代码示例

抽象模板类

/**
 * 抽象模板
 * 电脑组装
 */
public abstract class ComputerAssemble {

    /**
     * 组装
     */
    public final void assemble(){
        step1();
        step2();
        step3();
        step4();
        step5();
        step6();
    }

    /**
     * 准备工作
     */
    public void step1(){
        System.out.println("准备工具与零件");
    }

    /**
     * 安装显示屏
     */
    public abstract void step2();


    /**
     * 内存
     */
    public abstract void step3();

    /**
     * 硬盘
     */
    public abstract void step4();

    /**
     * 组装主机
     */
    public void step5(){
        System.out.println("组装主机");
    }

    public void step6(){
        System.out.println("组装电脑");
    }
}

具体实现类

/**
 * 具体模板
 * 高配
 */
public class HighComputer extends ComputerAssemble{
    @Override
    public void step2() {
        System.out.println("安装24寸4K显示屏");
    }

    @Override
    public void step3() {
        System.out.println("安装32G内存条");
    }

    @Override
    public void step4() {
        System.out.println("安装1T固态硬盘");
    }
}
/**
 * 具体模板
 * 低配电脑
 */
public class LowComputer extends ComputerAssemble{
    @Override
    public void step2() {
        System.out.println("安装16寸2K显示屏");
    }

    @Override
    public void step3() {
        System.out.println("安装8G内存条");
    }

    @Override
    public void step4() {
        System.out.println("安装1T机械硬盘");
    }
}

测试类

/**
 * 测试类
 */
public class TemplateTest {

    public static void main(String[] args) {
        ComputerAssemble low = new LowComputer();
        low.assemble();
        System.out.println("=================");
        ComputerAssemble high=new HighComputer();
        high.assemble();

    }
}

结果
在这里插入图片描述

3.优缺点

优点

  • 扩展性好,对不变的代码进行封装,对可变的进行扩展,符合开闭原则。

缺点

  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,会使系统变得复杂。

4.使用场景

  • 当需要将算法分解为一系列步骤,并且希望在不改变算法结构的前提下,允许子类改变某些步骤时。
  • 当希望将某些操作的执行延迟到子类时。
  • 当需要通过子类扩展或修改算法的特定步骤,以适应不同场景时。

总结

模板设计模式在实际开发中非常有用,特别是在需要执行一系列固定步骤,但某些步骤的具体实现需要由子类定制的场景中。它提高了代码的复用性和灵活性,同时保持了算法结构的一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目初始化踩坑记录

dependence not found: D:/yupiProject/yubi-bi-frontend/node_modules/umijs/plugins/node_modules/react-intl 这个没有在github上找到解决方法,于是我在命令行 npm install 执行这个之后,就可以重新运行了 思考过程:突然空了个文件我…

开放式耳机是什么意思?开放式耳机推荐

在探讨音频设备的广阔领域中,开放式耳机以其独特的设计理念和卓越的性能体验,逐渐成为耳机市场上一股不可忽视的力量。顾名思义,开放式耳机是一种采用开放式设计,不堵塞或覆盖耳朵,允许佩戴者同时听到部分外部声音的耳…

Unity滚滚车轮计划 之 新输入系统控制2D角色移动动画(俯视)

本系列的初衷是因为很多时候基础代码不得不重复又重复,所以为了更快更好地学习到新的知识,我就把已经掌握的知识造成自己的轮子吧,等用到的时候直接复制就行了 叠甲:虽然不能保证全是原创,有些写法可能烂大街&#xff…

arm64--内嵌汇编

内嵌汇编代码基本用法 1.作用:对于特定重要和时间敏感的代码进行优化,同时在C语言中访问某些特殊指令(例如内存屏障指令)来实现特殊功能 2.内嵌汇编代码主要有两种形式 基础内嵌汇编代码:不带任何参数 扩展内嵌汇…

【ES6新特性】介绍ES6新特性的内容,如var,Let,Const声明变量的区别,解构赋值的概念,字符串的扩展,数组的扩展,以及对象的扩展。

目录 1.var,let,const的区别 1.1 var 1.2 let 1.3 const 1.4 区别总结 2.解构赋值 2.1 基本解构化赋值 2.2 数组取值 2.3 对象解构化赋值和取值 2.4 Math对象的解构化使用 3. 字符串扩展 3.1 新增字符串遍历方式 3.2 模版字符串 3.3 字符串…

数据库学习笔记

一、数据库相关概念 主流的关系型数据库管理系统(DBMS) 关系型数据库以 表格 的形式存在,以 行和列 的形式存取数据,关系型数据库这一系列的行和列被称为表,无数张表组成了 数据库 ,常见的关系型数据库有 …

绿色积分引领:我店平台的可持续消费革命

在当今数字化浪潮的推动下,“我店”凭借其创新的环保积分系统,在消费市场中脱颖而出,逐渐改变着市场的结构。本文将详细分析该平台的竞争优势、市场策略以及它如何利用创新手段塑造未来的消费趋势。 一、环保积分:消费体验革新的关…

在ElementUI项目中集成iconfont图标库

在前端项目开发中经常会遇到使用的组件库提供的ICON图标不够用的情况。最常见的解决方案无非就是把设计图的图标切图引入到项目中。还有就是使用svg图标,封装一个渲染组件在项目里面直接引入这个组件。 本文将介绍另一种方法,即集成iconfont图标库的图标…

redis面试(二十二)读锁释放

假设现在已经有各种锁的重入什么的,那如何释放锁? 读锁读锁 假如说,同一个线程多次加读锁,或者不同的线程加了多个读锁 当前的锁结构长这样 anyLock: { “mode”: “read”, “UUID_01:threadId_01”: 2, “UUID_02:threadId_02…

CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(二)

CRUD老生常谈,但是我搜索了一圈,发觉几乎是着重在后端,也就是API部分! 无外乎2个思路 1.归总的接口,比如一个接口,实现不同表的CRUD 2.基于各自的表,使用代码生成器实现CRUD 个人来说是推荐2&am…

css设置input单选radio多选checkbox样式

最近接手一个古老的项目,要修改里边的主题颜色,使用css的var方法一路轻松,最后在input的单选radio和多选checkbox被踩了刹车,也是有几年没做这种原始的项目手生了,最后经过几番折腾后,通过input的伪元素将其…

FPGA开发——使用verilog实现异步FIFO

一、FIFO 介绍 1、FIFO的分类 FIFO ( First In First Out)先进先出存储器。根据接入的时钟信号,可以分为同步 FIFO 和异步 FIFO 。 FIFO 底层是基于双口 RAM ,同步 FIFO 的读写时钟一致,异步 FIFO 读时钟和…

一看就会的Mysql 集群技术

目录 一、Mysql介绍 1.1什么是MySQL 1.2MySQL的优势 1.3MySQL的常用语句 二、MySQL源码安装 三、实验练习 3.1MySQL部署 实验环境 实验步骤 1.创建用户,数据目录,更改权限 2.修改文件 3.初始化,会生成一个密码,将其保…

没有人会窃取你的想法,关键在于执行

没有人会窃取你的想法,关键在于执行 引言 当我第一次读到 Pieter Levels 的创业故事时,我感到无比激动和鼓舞。那种看到未来无限可能的感觉,让我充满了希望与奋斗的力量。他的经历不仅让我明白了创意的价值,更重要的是让我深刻感…

内网穿透的几种方法

内网穿透的几种方法 随着网络技术和应用的不断发展,越来越多的企业和个人需要实现内外网之间的数据交互和服务访问。然而,由于防火墙、NAT(网络地址转换)等安全措施的存在,直接从外部访问内部网络中的服务器或设备变得…

Linux基础软件-dns(一)

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux日常运维。讲的那些东西都算是系统自带的,但是Linux作为一个…

Nvidia驱动莫名其妙不好使了?nvidia-smi报错?如何解决?已解决!!

文章目录 一、报错提示二、解决方案2.1 原因1的解决办法2.2 原因2的解决方案 一、报错提示 Ubuntu20.04出现Failed to initialize NVML: Driver/library version mismatch问题NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver. 二、解决方案 …

深入探究linux文件IO

一、原子操作和竞争条件 所有系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。 以独占方式创建一个文件 结合 O_CREAT 和 O_EXCL 标志来一次性…

AI学习记录 - 怎么理解 torch 的 torch.nn.BatchNorm2d

画图不易,有用就点个赞 这里创建了一个随机张量,形状为 (4, 3, 4, 4),分别对应 形状为 (batch_size, num_channels, height, width) batch_size:批次 num_channels: 通道(什么是通道看上一章节&#xff0…

串口和RS485通信

一、 定义串口收发数据结构体 /*COM Received Data Structure*/ typedef struct {uint8_t ubr_EndFlag; //Received data end flag uint8_t ubr_buffer[300]; //Received data bufferuint8_t ubr_bufferTemp[300]; //Received data bu…