当前位置: 首页 > news >正文

工厂方法模式(五)

过气的,终究是过气了

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

一.工厂方法模式

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

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

组成角色具体关系作用
抽象产品(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{@Overridepublic void make() {log.info("制作中国蓝色披萨");}
}

二.二. 二 中国红色披萨

@Slf4j
public class ChineseRedPizza implements Pizza{@Overridepublic void make() {log.info("制作中国红披萨");}
}

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

@Slf4j
public class EluosiBluePizza implements Pizza{@Overridepublic void make() {log.info("制作俄罗斯蓝色披萨");}
}

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

@Slf4j
public class EluosiRedPizza implements Pizza{@Overridepublic void make() {log.info("制作俄罗斯红披萨");}
}

二.三 定义抽象工厂

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

二.四 定义具体的工厂

二.四.一 中国的工厂

public class ChineseAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {@Overridepublic 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 {@Overridepublic Pizza createPizaa(String type) {if ("red".equalsIgnoreCase(type)){return new EluosiRedPizza();}else if ("blue".equalsIgnoreCase(type)){return new EluosiBluePizza();}else {return null;}}
}

二.五 客户端调用

@Testpublic 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{@Overridepublic void make() {log.info("制作美国蓝色披萨");}
}
@Slf4j
public class MeiRedPizza implements Pizza{@Overridepublic void make() {log.info("制作美国红披萨");}
}

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

public class MeiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {@Overridepublic Pizza createPizaa(String type) {if ("red".equalsIgnoreCase(type)){return new MeiRedPizza();}else if ("blue".equalsIgnoreCase(type)){return new MeiBluePizza();}else {return null;}}
}

二.六.三 客户端调用

@Testpublic 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


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

相关文章:

工厂方法模式(五)

过气的,终究是过气了 上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章 一.工厂方法模式 工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。 将类的实例化(具体产品的创建&…...

力扣笔记(每日随机一题)——最佳买卖股票时机含冷冻期

问题(中等) 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后&a…...

yolov5 6.1 关于 tensorrt 加速的使用以及问题说明

文章目录 1. 参考连接2. 使用说明2.1 导出加速模型2.1 使用加速模型2.2 加速参数对比 3. 问题说明3.1 在 Tensorrt 8.4.1.5 版本上使用 export.py 导出失败的问题3.2 把模型文件由 best.pt 更换成加速后的 best.engine 后,执行推理时标注的类别名不正确的问题3.3 导…...

SVR(支持向量机)用法介绍

一、SVR回归介绍 SVR(Support Vector Regression)是支持向量机(SVM)在回归问题中的应用。与SVM分类模型相似,SVR也是一种非概率性算法,通过使用核函数将数据映射到高维空间,并在该空间上寻找最优的超平面与训练数据之间的间隔最大化&#xf…...

是面试官放水,还是公司实在是太缺人?这都没挂,腾讯原来这么容易进···

本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到腾讯可以再给我一次机会,还是挺开心的。 本来以为有个机会就不错啦!没想到能成功上岸,在这里要特别感谢帮我内推的同学&…...

算法模板(5):数学(1):数学知识(1)

数论 整数的整除性 [x]表示不超过x的最大整数,叫做取整函数或高斯函数。设整数a,b不同时为零,则存在一对整数m,n,使得 ( a , b ) a m b n (a, b) am bn (a,b)ambn。注:a和b的最大公因数会写成 (a, b)…...

电子行业 K 公司对接 Nexperia EDI 项目案例

项目背景 Nexperia 是一家全球领先的半导体制造商,专注于提供高性能、高可靠性和创新性的半导体解决方案。公司成立于2017年,是前飞思卡尔半导体业务的一部分,并在全球范围内拥有多个设计、研发和生产基地。 Nexperia 使用 EDI(…...

chatgpt赋能python:Python如何将英文转化为中文的最佳方法

Python如何将英文转化为中文的最佳方法 介绍 在现代全球化社会中,国与国之间的交流越来越频繁,相应的语言翻译工具的需求也愈发迫切。Python是一种易于学习、快速上手的编程语言,适合初学者和经验丰富的程序员使用,在语言翻译方…...

知道这些英文文档翻译的方式吗

在工作中,大家有没有遇到领导交给你一份外语的文档,要你去观看和理解,但是我们看不太懂或者没啥时间去一点点翻译怎么办呢?我们就需要有工具来将文档翻译,它是一项非常实用和便捷的功能,它可以将文档中的文…...

供应链安全

供应链安全 目录 文章目录 供应链安全目录本节实战可信任软件供应链概述构建镜像Dockerfile文件优化镜像漏洞扫描工具:Trivy检查YAML文件安全配置:kubesec准入控制器: Admission Webhook准入控制器: ImagePolicyWebhook关于我最后…...

华硕天选4原装Windows11系统带ASUSRECOVERY恢复工厂模式安装

华硕工厂恢复系统 ,安装结束后带隐藏分区以及机器所有驱动软件,奥创Myasus Recovery 文件地址https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 文件格式:5个底包(HDI KIT COM MCAFEE EDN) 1个引导工具TLK 支持ASUSRECOVERY型…...

数据库期末复习(8)并发控制

笔记 数据库DBMS并发控制(1)_旅僧的博客-CSDN博客 数据库 并发控制(2)死锁和意向锁_旅僧的博客-CSDN博客 同一个对象不能既有slock又有xlock; 冲突可串行化和锁 怎么判断是否可以进行冲突可串行化:简便的方法是优先图 只有不同对象和同一对象都是读才不能发生非串行化调…...

一文说透:低代码开发平台和零代码平台区别是什么?

低代码开发平台和零代码平台区别是什么? 一个简单的例子就可以解释清楚。 假设你想入住一套新房,回看住房变迁史: 最原始方式是:自己建造往后一点,交付“毛坯房”:开发商统一建小区,不需要自…...

4.将图神经网络应用于大规模图数据(Cluster-GCN)

到目前为止,我们已经为节点分类任务单独以全批方式训练了图神经网络。特别是,这意味着每个节点的隐藏表示都是并行计算的,并且可以在下一层中重复使用。 然而,一旦我们想在更大的图上操作,由于内存消耗爆炸&#xff0c…...

pymongo更新数据

使用 PyMongo,可以通过以下步骤将查询到的记录进行更新: 下面是一个简单的示例代码片段,展示如何向名为users的集合中的所有文档添加一个新字段age。 import pymongo # 连接 MongoDB client pymongo.MongoClient("mongodb://localh…...

手机软件测试规范(含具体用例)

菜单基本功能测试规范一、短消息功能测试规范测试选项操作方法观察与判断结果创建、编辑短消息并发送书写短消息1、分别使用菜单或快捷方式进入书写短消息是否有异常; 2、输入0个字符,选择、输入号码发送,应成功; 3、输入1个中文…...

mysql having的用法

having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。我的理解就是真实表中没有此数据,这些数据是通过一些函数生存。 SQ…...

大数据需要学习哪些内容?

大数据技术的体系庞大且复杂,每年都会涌现出大量新的技术,目前大数据行业所涉及到的核心技术主要就是:数据采集、数据存储、数据清洗、数据查询分析和数据可视化。 Python 已成利器 在大数据领域中大放异彩 Python,成为职场人追求…...

【c++】static和const修饰类的成员变量或成员函数

目录 1、静态成员变量 2、静态成员函数 3、常函数 4、常对象 当我们使用c的关键字static修饰类中的成员变量和成员函数的时候,此时的成员变量和成员函数被称为静态成员。 静态成员包含: 静态成员变量静态成员函数 1、静态成员变量 静态成员变量有…...

DVWA-9.Weak Session IDs

大约 了解会话 ID 通常是在登录后以特定用户身份访问站点所需的唯一内容,如果能够计算或轻松猜测该会话 ID,则攻击者将有一种简单的方法来访问用户帐户,而无需暴力破解密码或查找其他漏洞,例如跨站点脚本。 目的 该模块使用四种…...

Bug序列——容器内给/root目录777权限后无法使用ssh免密登录

Linux——创建容器并将本地调试完全的前后端分离项目打包上传docker运行_北岭山脚鼠鼠的博客-CSDN博客 接着上一篇文章结尾出现403错误时通过赋予/root目录以777权限解决403错误。 chmod 777 /root 现在又出现新的问题,远程ssh无法免密登录了,即使通过…...

华为OD机试真题 JavaScript 实现【服务中心选址】【2023Q1 100分 】

一、题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址,使服务中心到所有区域的距离的总和最小。 给你一个数组 positions,其中 positions[i] [le…...

<Linux>《OpenSSH 客户端配置文件ssh_config详解》

《OpenSSH 客户端配置文件ssh_config详解》 1、 ssh获取配置数据顺序2、关键字2.1 Host2.2 Match2.3 AddKeysToAgent2.4 AddressFamily2.5 BatchMode2.6 BindAddress2.7 BindInterface2.8 CanonicalDomains2.9 CanonicalizeFallbackLocal2.10 CanonicalizeHostname2.11 Canonic…...

Linux内核中内存管理相关配置项的详细解析8

接前一篇文章:Linux内核中内存管理相关配置项的详细解析7 十一、Enable KSM for page merging 对应配置变量为:CONFIG_KSM。 此项只有选中和不选中两种状态,默认为选中。 内核源码详细解释为: Enable Kernel Samepage Merging:…...

深入浅出Vite:Vite打包与拆分

一、背景 在生产环境下,为了提高页面加载性能,构建工具一般将项目的代码打包(bundle)到一起,这样上线之后只需要请求少量的 JS 文件,大大减少 HTTP 请求。当然,Vite 也不例外,默认情况下 Vite 利用底层打包引擎 Rollup 来完成项目的模块打包。 某种意义上来说,对线上环…...

大数据ETL工具Kettle

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言最近公司在搞大数据数字化,有MES,CIM,WorkFlow等等N多的系统,不同的数据源DB,需要将这些不同的数据源DB里的数据进行整治统一…...

大学物理(上)-期末知识点结合习题复习(4)——质点运动学-动能定理 力做功 保守力与非保守力 势能 机械能守恒定律 完全弹性碰撞

目录 1.力做功 恒力作用下的功 变力的功 2.动能定理 3.保守力与非保守力 4.势能 引力的功与弹力的功 引力势能与弹性势能 5.保守力做功与势能的关系 6.机械能守恒定律 7.完全弹性碰撞 题1 题目描述 题解 题2 题目描述 题解 1.力做功 物体在力作用下移动做功…...

这两个小众的资源搜索工具其实很好用

01 小不点搜索是一个中国网络技术公司开发的网盘搜索引擎,该网站通过与多个主流网盘进行整合,为用户提供一种快速查找和下载文件的方式。小不点搜索因其高效性、便利性和实用性受到了广大用户的喜爱。 在技术实现上,小不点搜索拥有先进的搜…...

Java设计模式(六)— 单例模式1

系列文章目录 单例模式介绍 单例模式之静态常量饿汉式 单例模式之静态代码饿汉式 单例模式之线程不安全懒汉式 文章目录 系列文章目录前言一、单例设计模式介绍二、单例设计模式八种方式三、单例—静态常量饿汉式1.静态常量饿汉式介绍2.静态常量饿汉式案例3.静态常量饿汉式优缺…...

iOS -- isa指针

isa指针:isa指针是一个指向对象所属类或元类的指针。它决定了对象可以调用的方法和属性。isa指针在对象的结构中存在,并且在运行时会被自动设置。isa 指针,表示这个对象是一个什么类。而 Class 类型, 也就是 struct objc_class * …...

东营网站建设优化/google中文搜索引擎

前言今天跟大家分享下SpringBoot 常见高频面试题的知识。下面是小编关于SpringBoot的知识点总结了一个思维导图,希望对大家所有帮助!话不多说,下面我们开始正题:1. 什么是SpringBoot?通过Spring Boot,可以轻松地创建独…...

网站建设分录/线上营销模式

定义结构 为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下: struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; . . …...

做a免费网站有哪些/免费推广软件工具

生物信息很多时候要爬数据。最近也看了一些这些方面的。 url<-"要爬取的网址" url.html<-htmlParse(url,encoding"UTF-8") 如果要获得部分信息&#xff0c;则使用XPath方法。 xpath<-"//*[id填写目标id]/span[id细分标签的id] 目标id.node&l…...

个人网站建设与维护/推广一般收多少钱

简介 为了方便开发人员可视化配置gpio&#xff0c;MTK提供了DCT工具&#xff0c;全称是Driver Customization Tool&#xff0c;该工具导入dws文件来产生驱动代码&#xff0c;它是个exe可执行程序&#xff0c;目前只支持在windows下运行&#xff0c;在ubuntu下运行可借助于wine…...

程序员做游戏还是做网站好/如何做网站推广广告

如果面试官问你&#xff0c;类加载过程是哪几步&#xff1f; 巴拉巴拉巴拉…&#xff08;加载、验证、准备、解析、初始化&#xff09; 见这小伙子面容惊奇&#xff0c;脸泛红光&#xff0c;不由自主地就问了一下双亲委派模型说一下吧&#xff1b;遇见没准备充分的&#xff0c;…...

昆山建设银行网站/东莞网络优化公司

目前为止&#xff0c;已经对 Vue 的基本用法有了初步了解。由于不想自己手动去开发组件&#xff08;一方面嫌丑&#xff0c;另一方面感觉上手太慢&#xff09;&#xff0c;所以直接就开始学习第三方组件库的使用。根据之前的前端开发经验&#xff0c;猜想 Vue 框架肯定存在着很…...