模板方法设计模式,让我的代码更加优雅了,这一波不亏

2023-11-14

模板方法设计模式属于行为模式的分类,为啥要使用设计模式?

使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题,让我们的代码更直观和优雅。

模板方法模式和策略模式都有相同之处就是有具体的行为实现,所以也是基于工厂模式的实现。

实际应用场景:工厂物料采购,金融支付,第三方数据采集,回调。都可以使用模板方法模式来构建。

某汽车生产厂家,需要采购一批物料,物料,清单,列入打印机材料,上位erp清单材料,还有汽车生产厂家物材,还有仓库硬件设备材料。对应不同的生产厂家,不同的采购方式和流程都会不一样。我们可以用工厂抽取去行为方法,让不同的子类工厂去实现不同的方式,从而达到高类聚,低耦合的方式满足设计模式的原则。

实现原则:实现原则的本身是由工厂提供方法,具体行为实现由特性去实现

汽车生产厂家需要其他公司提供服务和策略。

A公司打印服务

B公司上位物料

C公司汽车配件

静态工厂实现:

package com.xy.design.template.factory;

import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.config.ApplicationContextProvider;

/**
 * <p>
 *  模板工厂
 * @author xy
 * @since 2021-11-02
 */
public class TemPlateFactory {
    /**
     * 静态工厂实现
     * @param templateId
     * @return
     */
    public static TemplateAbstract getTeamplateFactory(String templateId){
       TemplateAbstract templateAbstract = (TemplateAbstract) ApplicationContextProvider.getBean(templateId);
       return  templateAbstract;

    }
}

抽象工厂:

package com.xy.design.template.abstracts;

/**
 * <p>
 *  抽象工厂
 * @author xy
 * @since 2021-10-21
 */
public abstract class TemplateAbstract {



    /**
     * 采购
     */
    public abstract   String  procurement();

    /**
     * 结算
     */
    protected  abstract  void settlement();

}

工厂实现:

package com.xy.design.template.factory.impl;

import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.common.Constants;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * 上位工厂
 */
@Service(Constants.UPPER_PLAN)
@Component
public class UpperFactory extends TemplateAbstract {


    @Override
    public String procurement() {
        return "采购了上位材料----------------";
    }

    @Override
    protected void settlement() {
        System.out.println("上位结算单-------------------");
    }
}
package com.xy.design.template.factory.impl;

import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.common.Constants;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * 打印工厂
 */
@Service(Constants.PRINT_ARRE)
@Component
public class PrintFactory extends TemplateAbstract {



    @Override
    public String procurement() {
        return "采购了大量打印耗材";
    }

    @Override
    protected void settlement() {
        System.out.println("打印结算单-------------------");
    }
}
package com.xy.design.template.factory.impl;

import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.common.Constants;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * 汽车工厂
 */
@Service(Constants.CAR_F)
@Component
public class CarFactory extends TemplateAbstract {


    @Override
    public String procurement() {
        return "采购了大量汽车零件";
    }

    @Override
    protected void settlement() {
      System.out.println("汽车结算单-------------------");
    }
}

实现类:我们通过静态工厂指定具体实现就可以了。

package com.xy.design.template.service;

import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.config.ApplicationContextProvider;
import com.xy.design.template.factory.TemPlateFactory;
import org.springframework.stereotype.Service;

/**
 * <p>
 *
 * @author xy
 * @since 2021-11-02
 */
@Service
public class TourismServiceImpl implements TourismService {


    @Override
    public String procurement(String templateId) {
        TemplateAbstract templateAbstract = TemPlateFactory.getTeamplateFactory(templateId);
        return templateAbstract.procurement();
    }
}

模板方法模式基于行为模式,模板方法模式和策略模式有共同的特性,都是通过Factory工厂实现,也是用到了抽象和继承。抽象类抽象出方法,定义模板方法,具体的逻辑步骤交给实现工厂去实现,从而达到了骨架逻辑的抽离。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板方法设计模式,让我的代码更加优雅了,这一波不亏 的相关文章

  • 设计模式——Visitor(访问者)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 Java实际应用举例 以ASM技术为例 4 1 被访问对象 ClassReader 4 2 Visitor ClassVisitor 4 3 具体visitor
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • 【设计模式】工厂模式(Factory Pattern)

    1 概述 工厂模式 Factory Pattern 是最常用的设计模式之一 它属于创建类型的设计模式 它提供了一种创建对象的最佳方式 在工厂模式中 我们在创建对象时不会对客户端暴露创建逻辑 并且是通过一个共同的接口来指向新创建的对象 工厂模
  • JavaScript设计模式-02-单例模式

    Javascript 设计模式 02 单例模式 简介 单例就是保证一个类只有一个实例 实现的方法一般是先判断实例是否存在 如果存在直接返回 如果不存在就创建了再返回 确保了一个类只有一个实例对象 在JavaScript里 单例作为一个命名空
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 在AI技术的无情侵袭下,学学Java的23种设计模式还是非常有必要的

    目前国内80 程序员的主要工作是调用组合api实现各种业务需求 在顶层架构师设定好的框架下 做着重复且无聊的编码工作 如果未来ai被广泛应用 那么被替代的风险是很高的 比较扎心的是 其实目前用ai生成片段代码已经是各个公司比较普遍的做法了
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest

随机推荐

  • Linux云计算-02_CentOS Linux 7.X系统管理

    Linux系统安装完毕 需要对Linux系统进行管理和维护 让Linux服务器能真正应用于企业中 本章介绍Linux系统32位与64位区别 内核命名规则 引导原理 启动流程 TCP IP协议概述 IP地址及网络知识 CentOS 7密码重置
  • Windows libreOffice develpemet 搭建

    2020 7 10 Personal 7 1 参考 https wiki documentfoundation org Development lode https wiki documentfoundation org Developme
  • 使用 java 命令编译运行 java 程序

    java 编译的过程 就是将 java 项目从源文件变成 class 文件的过程 而 class 文件 最后会被加载到JVM 中运行 在 JDK bin 目录下 提供了 javac 命令 用于将 java 源文件编译成 class 字节码文
  • 贤者之路,Cuda block内部矩阵求逆,mxm矩阵 复杂度为O(m)

    在做线性变换上经常要用到NXN的矩阵求逆 在CUDA用的是高斯消元比较适合并行计算 下面是3X3Cuda实现矩阵求逆的Device函数 也就是说可以直接写到你的kernel函数上去 当然也可以是任何NXN矩阵 另外时间上 测试过6X6的矩阵
  • 解读YOLO v7的代码(三)损失函数

    在前两篇博客中我分析了YOLO v7的模型结构以及训练数据的准备 这里将对损失函数的代码进行分析 在train py中 我们可以看到以下的代码是进行损失值计算的 if loss ota not in hyp or hyp loss ota
  • 集成电路模拟版图入门-版图基础学习笔记(一)

    IC模拟版图设计 了解版图 版图的定义 版图是在掩膜制造产品上实现 电路功能且满足电路功耗 性能等 从版图上减少工艺制造对电路的偏差 提高芯片的精准性 版图的意义 1 集成电路掩膜版图设计师实现集成电路制造所必不可少的设计环节 它不仅关系到
  • 爬虫确定分页

    直接能确定分页数的直接根据分页num构造 导航栏目主页不能直接确定分页数 需要通过下一页来确定最后一页 这边主要介绍第二类如果下一页还存在 放进分页列表 就不是最后一页 如果不存在就是最后一页 import requests import
  • 快来考取属于自己的“区块链证书”吧!

    想要学习或参加 区块链咨询师 线上考试的朋友可识别下方海报二维码 进行报名登记 考试成绩合格 80分及以上 者 即可获得 区块链咨询师 初级 证书 证书的持有人身份及发证机构的法人身份由公安部第三研究所牵头的数字身份技术应用联合实验室提供权
  • Matlab数学建模学习(5)-- 神经网络常用传递函数

    常用传递函数 1 线性传递函数 purelin 图像表示为 f x x f x x f x x 2
  • 【学习笔记】 Thymeleaf的前端渲染(价值50)

    学习笔记 Thymeleaf的前端渲染 价值50 博客首页 文章目的 Thymeleaf前端页面的渲染 博主也在学习阶段 如若发现问题 请告知 非常感谢 同时也非常感谢各位小伙伴们的支持 每日一语 不要在夕阳下时幻想 要在旭日东升时努力 吾
  • ubuntu下各种软件与库安装(个人记录)

    ubuntu下各种软件与库安装 个人记录 环境 ubuntu20 04 软件安装 wps2019 Clion grub customizer disk usage analyzer 各种库安装 opencv 3 2 0以及opencv co
  • 19年就业形势怎么样

    我们都知道去年开始就业形势就不太好 尤其是程序员群体 好多人辞职后找不到合适的工作 同时越来越多中小企业出现了大厂 名校的求职者 就业形势的严峻性可见一斑 今天这篇文章结合 19 年上半年的就业数据做一个简单的分析总结 看看目前整体的形势
  • QT不同项目之间怎么调用其他项目里的类对象?

    以下方法解决的问题 假设有A B C三个项目 A中有一个类 B C都有用到 怎么直接调用而不是用笨方法慢慢的复制粘贴 重点在 pri分文件处理上 步骤如下 一 首先把这个共同要使用到的类弄成分文件管理 同一个项目里 分文件管理的方法 1 在
  • ROS初学(rosrun执行找不到可以执行的node)

    此处特殊标注 方案一 在命令空间文件夹内直接执行 catkin make 方案二 在code中 点击ctrl shift b出现 选择catkin make build行的设置图标 保存task json 错误实例 选择catkin mak
  • EndNote和Word关联&&“endnote cwyw dll不是有效的office加载项“解决方案

    一 问题背景 前不久把Word重装了一遍 装好了以后就重新打开 无奈之前的EndNote插件不见了 这对于要查文献的我真的受到了一万点伤害 有点夸张 但其实也还好 不过EndNote导出文献格式真的很方便 对于我看文献做笔记啥的还是非常有帮
  • CentOS7下Grafana简单安装测试使用。

    Grafana安装 yum 方式安装 设置安装源 vim etc yum repos d grafana repo grafana name grafana baseurl https packages grafana com enterp
  • 阿里云2核4G轻量应用服务器5M峰值带宽性能评测

    阿里云双十一金秋云创季轻量应用服务器2核4G配置 系统盘为60GB ESSD云盘 5M峰值带宽 每月1100GB流量 轻量服务器每月流量不够用的的话 超出流量为0 8元每GB 阿里云百科来详细说下阿里云2核4G轻量应用服务器配置及购买条件
  • 奇安信笔试编程题

    package one import java util 3 1 5 21 10 7 0 3 3 1 5 3 3 3 1 5 21 10 0 3 3 1 5 5 public class Main public static int res
  • 指数族分布

    写在前面 本文只是对暂时学到的指数族分布的理论知识进行总结 至于指数族分布在实际机器学习中的具体应用 等后续学习到了再进行补充 也欢迎有经验的大佬赐教 文章将按照下面的思路进行 第一章首先给出指数族分布通用的 pdf 的表达式 简单介绍什么
  • 模板方法设计模式,让我的代码更加优雅了,这一波不亏

    模板方法设计模式属于行为模式的分类 为啥要使用设计模式 使用设计模式可以重构整体架构代码 提交代码复用性 扩展性 减少代码冗余问题 让我们的代码更直观和优雅 模板方法模式和策略模式都有相同之处就是有具体的行为实现 所以也是基于工厂模式的实现