设计模式三:工厂模式

工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式,其中后两者属于23中设计模式

各种模式中共同用到的实体对象类:

//汽车类:宝马X3/X5/X7;发动机类:B48TU、B48//宝马汽车接口
public interface BMWCar {void show();
}//发动机接口
public interface Engine {void show();
}//宝马X3
public class BMWX3 implements BMWCar {@Overridepublic void show() {System.out.println("华晨宝马X3:39.96-48.69万");}
}//宝马X5
public class BMWX5 implements BMWCar {@Overridepublic void show() {System.out.println("华晨宝马X5:58.75-80万");}
}//宝马X7
public class BMWX7 implements BMWCar {@Overridepublic void show() {System.out.println("华晨宝马X3:89.35-102.25万");}
}//B48TU发动机
public class B48TUEngine implements Engine {@Overridepublic void show() {System.out.println("B48TU:涡轮增压 压缩比 11:1");}
}//B48发动机
public class B48Engine implements Engine {@Overridepublic void show() {System.out.println("B48:涡轮增压 压缩比 10.2:1");}
}

1、简单工厂模式

  • 模型

​ 用户只需要使用汽车生产工厂,告诉其想要生产的车型,具体生产细节不需要了解即可得到希望车型
在这里插入图片描述

  • 实现
//简单工厂类
public class BMWCarFactory {public static BMWCar buy(String carName){switch (carName){case "BMWX5":return new BMWX5();case "BMWX3":return new BMWX3();default:return null;}}
}//测试
public class Consumer {public static void main(String[] args) {BMWCar bmwCar = BMWCarFactory.buy("BMWX5");if (bmwCar == null){System.out.println("无该车型");}assert bmwCar != null;bmwCar.show();}
}

简单工厂模式:

再添加一个宝马产品,就要修改factory类

1、使用进阶版简单工厂模式

2、使用工厂方法模式,即有自工厂生产对应车型,X5由X5Factory生产,X3由X3Factory生产,在添加一种车型,则对应添加一个工厂类型

简单工厂模式适用于的场景:

1、适用 于工厂类负责创建的对象较少的场景,

2、且客户端只需要传入工厂类的参数,对于如何创 建对象的逻辑不需要关心。

简单工厂模式缺点:

1、工厂类的职业相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则

2、不易于扩展过于复杂的产品结构

2、进阶版简单工厂模式

//工厂类
public class BMWFactory {public static <T> T buy(Class<T> clazz){try {return clazz.newInstance();} catch (Exception e) {return null;}}
}//测试
public class Consumer {public static void main(String[] args) {BMWCar newCar = BMWFactory.buy(BMWX3.class);if (newCar == null){System.out.println("无该车型");}newCar.show();}
}

3、工厂方法模式

  • 模型
    在这里插入图片描述
//宝马工厂接口
public interface BMWCarFactory {BMWCar buy();
}//BMWX3工厂
public class BMWX3CarFactory implements BMWCarFactory {@Overridepublic BMWCar buy() {//可在这里做一定处理,对客户不可见,即对客户是透明的//......return new BMWX3();}
}//BMWX5工厂
public class BMWX5CarFactory implements BMWCarFactory {@Overridepublic BMWCar buy() {//可在这里做一定处理,对客户不可见,即对客户是透明的//......return new BMWX5();}
}//BMWX7工厂
public class BMWX7CarFactory implements BMWCarFactory {@Overridepublic BMWCar buy() {//可在这里做一定处理,对客户不可见,即对客户是透明的//......return new BMWX7();}
}//测试
public class Consumer {public static void main(String[] args) {BMWCar bmwCar = BMWCarFactory.buy("BMWX5");if (bmwCar == null){System.out.println("无该车型");}assert bmwCar != null;bmwCar.show();}
}

工厂方法模式的适用场景:

1、创建对象需要大量重复的代码

2、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节,一个类通过其子类来指定创建哪个对象。

工厂方法模式的优点:

1、用户只关系所需产品对应的工厂,无须关心创建细节。

2、加入新产品符合开闭原则,提高了系统的可扩展性。

工厂方法模式的缺点:

1、类的个数容易过多,增加了代码结构的复杂度。

2、增加了系统的抽象性和理解难度。

工厂方法模式:

如果处了汽车之外,新增加发动机产品 B48TU发动机(X5搭载) 和 B48发动机(X3搭载)

那么需要新增发动机工厂接口、B48TU工厂、B48工厂、发动机接口、B48TU发动机、B48发动机

如下图所示
在这里插入图片描述

4、抽象工厂模式

  • 模型

在这里插入图片描述

  • 实现
//宝马工厂接口
public interface BMWFactory {BMWCar buyCar();Engine buyEngine();
}//宝马X3工厂
public class BMWX3Factory implements BMWFactory {@Overridepublic BMWCar buyCar() {return new BMWX3();}@Overridepublic Engine buyEngine() {return new B48Engine();}
}//宝马X5工厂
public class BMWX5Factory implements BMWFactory {@Overridepublic BMWCar buyCar() {return new BMWX5();}@Overridepublic Engine buyEngine() {return new B48TUEngine();}
}//测试
public class Consumer {public static void main(String[] args) {BMWFactory factory = new BMWX3Factory();factory.buyCar().show();factory.buyEngine().show();}
}

抽象工厂模式:

将不同种类,同一等级的类放在一个工厂加工

但是新增产品时需要修改工厂类

抽象工厂模式使用场景:

1、客户端(应用层)不依赖于产品类实例如何被创建,实现等细节。

2、强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。

3、提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体的实现。

抽象工厂模式优点:

1、具体产品在应用层代码隔离,无须关系创建细节。

2、将一个系列的产品族统一到一起创建。

抽象工厂模式缺点:

1、规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。

2、增加了系统的抽象性和理解难度。

5、spring中的工厂模式

Calendar.getInstance()   //简单工厂模式
LoggerFactory、BeanFactory、FactoryBean   //工厂方法模式
Calendar
if (aLocale.hasExtensions()) {String caltype = aLocale.getUnicodeLocaleType("ca");if (caltype != null) {switch (caltype) {case "buddhist":cal = new BuddhistCalendar(zone, aLocale);break;case "japanese":cal = new JapaneseImperialCalendar(zone, aLocale);break;case "gregory":cal = new GregorianCalendar(zone, aLocale);break;}}
}
BeanFactory
public class TestBeanFactory {public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();// bean 的定义(class, scope, 初始化, 销毁)AbstractBeanDefinition beanDefinition =BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();beanFactory.registerBeanDefinition("config", beanDefinition);// 给 BeanFactory 添加一些常用的后处理器AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);});// 打印BeanFactory中Beanfor (String name : beanFactory.getBeanDefinitionNames()) {System.out.println(name);}}@Configurationstatic class Config {@Beanpublic Bean1 bean1() {return new Bean1();}@Beanpublic Bean2 bean2() {return new Bean2();}}static class Bean1 {private static final Logger log = LoggerFactory.getLogger(Bean1.class);public Bean1() {log.debug("构造 Bean1()");}@Autowiredprivate Bean2 bean2;public Bean2 getBean2() {return bean2;}}static class Bean2 {private static final Logger log = LoggerFactory.getLogger(Bean2.class);public Bean2() {log.debug("构造 Bean2()");}}
}

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

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

相关文章

Bert基础(一)--transformer概览

1、简介 当下最先进的深度学习架构之一&#xff0c;Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络&#xff0c;并且以它为基础衍生出了诸如BERT、GPT-3、T5等…

2024全年放假日历表及调休安排 用手机便签设置放假倒计时

对于绝大多数的上班族来说&#xff0c;春节长假已经结束&#xff0c;现在要回归到正常的工作和生活中。为了给生活增加一些“盼头”&#xff0c;很多小伙伴不约而同打开手机日历&#xff0c;查看下个法定节假日是什么时候。下面给大家具体讲一下2024全年放假日历表及调休安排&a…

UE5 C++ 创建可缩放的相机

一.要将相机设置在Pawn类里 1.在MyPawn头文件里&#xff0c;加上摇臂和相机组件 #include "GameFramework/SpringArmComponent.h" #include "Camera/CameraComponent.h" 2.在Pawm里声明SceneComponet&#xff0c;SpringArmComponent,CameraComponent组件…

Excel生成不重复的UUID

第一步&#xff1a;在单元格中使用函数 第二步&#xff1a;下拉批量生成 生成函数如下&#xff1a; CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,42949),4),,DEC2HEX(RANDBETWEEN(0,42949),4),DEC2HEX(RANDBETWEEN(0,42949),4),DEC2HEX(RANDBETW…

Unity MVC开发模式与开发流程详解

在Unity游戏开发中&#xff0c;采用MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#x…

vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度

目录 思路 安装css-color-function【接收一个颜色值&#xff0c;生成不同的透明度】 获取后台配置的主题色或者使用ColorPicker修改主题色 最终结果如下 思路 本篇文章的主体思路是从element Plus官网引申而来。结合了我以前用vue2element-ui配置主题色生成透明度&#x…

谈谈:你在工作中用到的设计模式!

谈谈:你在工作中用到的设计模式! Hello大家龙年好! 春节的假期转眼间过去,我们也要回归往日的节奏 因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起设计模式在工作中的应用,既有点熟悉,又有点陌生, 在网上看吧,又感觉鸡肋(为啥?不能解燃煤之急啊!哈哈),所以,为了打破这…

体验即王道:提升B端管理系统用户体验的10大法则

大家好&#xff0c;我是贝格前端工场&#xff0c;专注于前端开发和UI设计&#xff0c;有需求可以私信。本篇从用户体验角度来分析管理系统如何设计和开发。 一、用户体验的重要性 B端管理系统的用户体验对于企业的成功至关重要。 提高工作效率&#xff1a;一个好的用户体验可…

什么是网络安全?一文了解网络安全究竟有多重要!

随着互联网的普及和数字化进程的加速&#xff0c;网络安全已经成为我们生活中不可或缺的一部分。然而&#xff0c;很多人对于网络安全的概念仍然模糊不清。 那么&#xff0c;什么是网络安全&#xff1f;它究竟有多重要呢&#xff1f; 一、网络安全的定义 网络安全是指保护网络…

Sora一出 哪里又要裁员了?

上班前夕迎来大新闻&#xff0c;那就是Sora了&#xff0c;Sora是什么&#xff0c;有什么牛逼之处&#xff0c;怎么实现的&#xff0c;我们跟着官方文档透露出来的一点点信息&#xff0c;简单的捋一捋。 一、Sora是什么 官方给出的定义是&#xff1a;世界模拟器。这很明显有夸大…

js 多对象去重(多属性去重)

需求中发现后端可能没有处理重复数据&#xff0c;这个时候前段可以直接解决。 在 JavaScript 中&#xff0c;可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型&#xff0c;其特点是元素不会重复且无序。 下面是一个示例代码&#xff0c;展示如何通过 S…

three.js 物体下落动画(重力加速度)

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><el-button click"loopFun"> 物体下落…

kubuntu 解决 kwallet 弹窗问题

问题 启动 kubuntu 后, 自动弹框要求验证 kwallet 的密码 查看本次启动中与 kwallet 有关的日志 $ journalctl -b | grep kwallet解决 开启 sddm/gdm 登录后自动解锁 kwallet 的功能 安装 kwallet-pam 模块 一般来说系统自带该模块 $ sudo apt install libpam-kwallet5 l…

机器学习基础(二)监督与非监督学习

导语&#xff1a;更深入地探讨监督学习和非监督学习的知识&#xff0c;重点关注它们的理论基础、常用算法及实际应用场景。 上一节我们深入探索机器学习的根本原理&#xff0c;包括基本概念、分类及如何通过构建预测模型来应用这些理论&#xff0c;详情可见&#xff1a; 机器学…

京东数据分析|京东销售数据怎么查|京东销售数据查询软件分享!

京东销售数据分析对商家来说具有多方面的重要作用&#xff0c;主要体现在以下几个方面&#xff1a; 市场趋势分析&#xff1a; 分析京东平台上的商品销量、销售额和价格走势等数据&#xff0c;可以帮助商家了解当前市场的整体需求趋势&#xff0c;以及不同品类的季节性变化、…

面向未来的全面预算管理,财务团队应具备的技能

当企业置身于当今这个瞬息万变的市场环境中时&#xff0c;每一次的数据分析和战略决策都至关重要。财务团队作为企业提升盈利能力和保持可持续发展的核心&#xff0c;不仅要适应不同的管理需求和不断变化的市场环境&#xff0c;还需要协助企业保持竞争优势和领先地位。经济世界…

「函数递归小课堂」~(C语言)

先赞后看&#xff0c;不足指正! 这将对我有很大的帮助&#xff01; 所属专栏&#xff1a;C语言知识 阿哇旭的主页&#xff1a;Awas-Home page 目录 引言 1. 什么是递归&#xff1f; 2. 递归的限制条件 3. 递归应用举例 3.1 求 n 的阶乘 3.2 图例演示 3.3 代码实现 4…

基于JAVA+SpringBoot+Vue的前后端分离的电影院售票管理运营平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 该系统研究背景聚焦于…

解密短视频上火爆的“私董会”现象

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近“私董会”一词再一次上了热门&#xff0c;先是一夜暴火的商业博主dada管培生翻车暴雷&#xff0c;后面是三言财经、互联网大V纷纷发表了自己的看法。 国内领先的私董会服务机构通常每年的收费都在3万元起步。…

Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录 LDM概述原理模型架构自编码器模型扩散模型条件引导模型图像生成过程 实验结果指标定义IS&#xff08;越大越好&#xff09;FID&#xff08;越小越好&#xff09; 训练成本与采样质量分析不带条件的图片生成基于文本的图片生成基于语义框的图片生成基于语义图的图片生成…