工厂方法模式(五)

news2024/11/17 7:47:00

过气的,终究是过气了

上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章

一.工厂方法模式

工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

组成角色具体关系作用
抽象产品(Product)Pizza具体产品的父类描述具体产品的公共接口
具体产品(Concrete Product)Chinese1,Eluosi1抽象产品的子类;工厂类创建的目标类描述生产的具体产品
抽象工厂(Creator)AbsOrderPizzaFactory具体工厂的父类描述具体工厂的公共接口
具体工厂(Concrete Creator)ChineseAbsOrderPizzaFactoryFactory 等抽象工厂的子类;被外界调用描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

image-20230613162547864

二. 实例讲解

二.一 定义抽象产品

public interface Pizza {
    void make();
}

二.二 定义具体的产品

二.二.一 中国蓝色披萨

@Slf4j
public class ChineseBluePizza implements Pizza{

    @Override
    public void make() {
        log.info("制作中国蓝色披萨");
    }
}

二.二. 二 中国红色披萨

@Slf4j
public class ChineseRedPizza implements Pizza{

    @Override
    public void make() {
        log.info("制作中国红披萨");
    }
}

二.二. 三 俄罗斯蓝色披萨

@Slf4j
public class EluosiBluePizza implements Pizza{

    @Override
    public void make() {
        log.info("制作俄罗斯蓝色披萨");
    }
}

二.二. 四 俄罗斯红色披萨

@Slf4j
public class EluosiRedPizza implements Pizza{

    @Override
    public void make() {
        log.info("制作俄罗斯红披萨");
    }
}

二.三 定义抽象工厂

public  interface AbsOrderPizzaFactory {
     public Pizza createPizaa (String type);
}

二.四 定义具体的工厂

二.四.一 中国的工厂

public class ChineseAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {

    @Override
    public Pizza createPizaa(String type) {
        if ("red".equalsIgnoreCase(type)){
            return new ChineseRedPizza();
        }else if ("blue".equalsIgnoreCase(type)){
            return new ChineseBluePizza();
        }else {
            return null;
        }
    }
}

二.四.二 俄罗斯的工厂

public class EluosiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {

    @Override
    public Pizza createPizaa(String type) {
        if ("red".equalsIgnoreCase(type)){
            return new EluosiRedPizza();
        }else if ("blue".equalsIgnoreCase(type)){
            return new EluosiBluePizza();
        }else {
            return null;
        }
    }
}

二.五 客户端调用

@Test
    public void oneTest() {

        AbsOrderPizzaFactory absOrderPizzaFactory = new ChineseAbsOrderPizzaFactoryFactory();

        Pizza pizza = absOrderPizzaFactory.createPizaa("red");

        pizza.make();

        pizza = absOrderPizzaFactory.createPizaa("blue");
        pizza.make();

        absOrderPizzaFactory =   new EluosiAbsOrderPizzaFactoryFactory();

        pizza = absOrderPizzaFactory.createPizaa("red");

        pizza.make();
    }

image-20230613163443154

二.六 新增加种类

如果现在新增加 美国的 蓝色 和红色 披萨, 那么不需要改变之前的东西, 只需要增加具体的产品和具体的工厂实现即可

二.六.一 新增加具体的产品

@Slf4j
public class MeiBluePizza implements Pizza{

    @Override
    public void make() {
        log.info("制作美国蓝色披萨");
    }
}
@Slf4j
public class MeiRedPizza implements Pizza{

    @Override
    public void make() {
        log.info("制作美国红披萨");
    }
}

二.六.二 新增加具体的工厂实现

public class MeiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {

    @Override
    public Pizza createPizaa(String type) {
        if ("red".equalsIgnoreCase(type)){
            return new MeiRedPizza();
        }else if ("blue".equalsIgnoreCase(type)){
            return new MeiBluePizza();
        }else {
            return null;
        }
    }
}

二.六.三 客户端调用

@Test
    public void twoTest() {

        AbsOrderPizzaFactory absOrderPizzaFactory = new MeiAbsOrderPizzaFactoryFactory();

        Pizza pizza = absOrderPizzaFactory.createPizaa("red");

        pizza.make();

        pizza = absOrderPizzaFactory.createPizaa("blue");
        pizza.make();
        
    }

image-20230613163712642

工厂方法不支持 产品族, 只是生成一个单一的对象实例


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/MethodFactory


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

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

相关文章

全网最火爆,性能测试基本原则方法总结,再不卷就被淘汰了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试关键点 …

2023 年牛客网最新版大厂 Java 八股文面试题总结(覆盖所有面试题考点)

序员真的是需要将终生学习贯彻到底的职业,一旦停止学习,离被淘汰,也就不远了。 金九银十跳槽季,这是一个千年不变的话题,每到这个时候,很多人都会临阵磨枪,相信不快也光。于是,大家…

什么是Vue的数据流(单向数据流)?如何进行数据流管理

什么是Vue的数据流(单向数据流)?如何进行数据流管理 在Vue中,数据流是指数据的传递和管理方式。Vue采用的是单向数据流,也就是说,数据是从父组件流向子组件,子组件不能直接修改父组件的数据。本…

夏季来临居民如何预防电气火灾隐患

安科瑞虞佳豪 居住场所预防电气火患 请注意以下几点 1.用具有生产许可证或CCC证书并与居住场所的环境相适应的电气线路以及插座、插线板、充电器、用电设备等电器产品; 2.不私自拉接电气线路;不随意更改电气线路保护装置; 3.不随意更换原…

泛娱乐社交(一)直播产品商业化解决方案

摘要 在过去几年的直播行业创业风口期中,直播的用户关注度疯狂增长,但用户质量却参差不齐。随着用户新鲜感一过,流失率变得相当严重,各大平台都在竭尽全力防御。然而,留住“凑热闹”的非直播受众用户并不是最关键的问…

SpringBoot(基础篇)

SpringBoot基础篇 入门案例 在创建SpringBoot项目时,会出现以下不需要的文件,如果每次都手动删除的话,就会很麻烦。 教你一招 在setting设置中找到Editor,选择File Types–>Ignored Files and Folders–>点击号&#xff…

pycharm使用之torch_geometric安装

正式安装之前要先查看一下torch的版本 一、查看torch版本 1、winR ,输入cmd 2、输入python 3、 输入import torch,然后输入torch.__version__,最后回车 可以看到我的torch版本是1.10.0 二、下载合适的版本 1、打开链接 https://pytorch-…

千万级入口服务[Gateway]框架设计(一)

本文将以技术调研模式编写,非技术同学可跳过。 文章目录 背景问题[不涉及具体业务]目标技术选型语言框架模式实现一:go 原生组件Demo 实现Benchwork 基准性能小结实现二:开源 go-plugin 附录入口服务演变 背景 在历史架构的迭代中&#xff…

Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR

警告:此功能处于技术预览阶段,可能会在未来的版本中更改或删除。 Elastic 将尽最大努力修复任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。 Elastic Learned Sparse EncodeR - 或 ELSER - 是由 Elastic 训练的检索模型&#…

Python程序员必会技能:如何在Python中连接数据库获取数据

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 想要成为一名数据分析师,一个最基础的技能就是:提取数据。 数据是数据分析的基础。 因此,掌握各种获取数据的技能一定是一个合格的数据分析师的必备技能。 而我们的需要进行提取的…

总结排查服务器上传下载慢的几种手段与查看服务器带宽的具体方法

一、排查服务器上传下载 最近出现的一个情况,服务器上传和下载比较慢,因此我排查了种种手段,特此记录下几种常见的手段。 1、使用speedtest-cli 测试网速: 该方法是测试网速的速度怎么样,看看是否真的慢? …

python中os库用法详解(总结)

os库主要是对文件和文件夹进行操作,在Python中对⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能。 具体步骤如下: 1. 导⼊os模块 import os 2. 使⽤ os 模块相关功能 os.函数名() 1、⽂件重命名 os.rename(⽬标⽂件名, 新⽂件名) 示例代码&#…

使用Docker从0开始在Linuex部署springboot项目(图文并茂)

一、前言 在腾讯云新买的洁白如新的云服务器,想要使用docker去部署springboot项目,特此记录! 二、安装jdk 参考博客:https://blog.csdn.net/weixin_45853881/article/details/123402891 2.1 检查jdk 直接在腾讯云平台登陆云服…

软件测试进阶知识 —— 自动化测试总结

自动化测试 自动化测试的定义:使用一种自动化测试工具来验证各种软件测试的需求,它包括测试活动的管理与实施、测试脚本的开发与执行。 自动化测试只是测试工作的一部分,是对手工测试的一种补充; 自动化测试绝不能代替手工测试;多数情况下&a…

怎样高效率备考PMP

一方面由于这些考试的知识,在准备考试前我们大部分很少接触,大部分人考试的目的也未必是感兴趣,更多是因为考试结果能给我们带来的收益。因此长时间的学习不熟悉甚至不感兴趣的很容易疲倦,这不像我们工作或生活中的一些技能&#…

怎样用U盘重装Win10系统?用U盘重装Win10系统教程

怎样用U盘重装Win10系统?有些新手用户在问怎样用U盘才能完成Win10系统的重装,这时候用户需要准备一个U盘、一个能够正常联网的电脑,然后按照以下分享的用U盘重装Win10系统教程操作,就能轻轻松松完成Win10系统的重装。 准备工作&am…

482576-74-9,Fmoc-Thr(Ac4Manα1-2Ac3Manα1-2Ac3Manα)-OH,肽链中可以糖基化的主要是Ser和Thr

【产品描述】 Fmoc-Thr(Ac4Manα1-2Ac3Manα1-2Ac3Manα)-OH(CAS:482576-74-9)中肽链中可以糖基化的主要是Ser和Thr,此外还有酪氨酸、羟赖氨酸和羟脯氨酸糖基化修饰的糖肽,链接的位点是这些残基侧链上的羟基氧原子。连接的糖为半乳…

Element常用组件之 表单组件 form

1. 建立form.vue <template><el-form ref"form" :model"form" label-width"80px"><el-form-item label"活动名称"><el-input v-model"form.name"></el-input></el-form-item><el-f…

Pandas的窗口函数rolling和expanding用法说明

Pandas的窗口函数rolling和expanding 1、rolling 移动窗口 rolling() 移动窗口函数&#xff0c;它可以与 mean、count、sum、median、std 等聚合函数一起使用。为了使用方便&#xff0c;Pandas 为移动函数定义了专门的方法聚合方法&#xff0c;比如 rolling_mean()、rolling_…

ArduPilot之H743自动PID调节

ArduPilot之H743自动PID调节 1. 源由2. 涉及参数2.1 AUTOTUNE_*2.2 RCx_OPTION 3. 自动校准3.1 预准备3.2 参数配置3.3 操作步骤 4. 实操&总结5. 参考资料6. 补充视频 1. 源由 ArduCopter可以自动通过算法来对PID进行调优&#xff0c;不过这里有个前提是模型噪声要比较少。…