工厂模式(四)

news2024/11/15 18:05:44

过气的,终究是过气了

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

一. 工厂模式

引用 菜鸟教程里面的单例模式介绍: https://www.runoob.com/design-pattern/factory-pattern.html

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,
它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

一.一 介绍

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景:

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。
如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

二. 代码实现

image-20230613155948114

二.一 定义一个接口

public interface Pizza {

    void make();
}

二.二 接口相应的实现类

二.二.一 中国披萨

@Slf4j
public class ChinesePizza implements Pizza{

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

二.二.二 俄罗斯披萨

@Slf4j
public class EluosiPizza implements Pizza{

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

二.二.三 美国披萨

@Slf4j
public class MeiPizza implements Pizza{

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

二.三 之前错误处理

@Test
    public void oldTest() {
        Pizza pizza = new ChinesePizza();
        pizza.make();

        pizza = new MeiPizza();
        pizza.make();
    }

image-20230613160329572

二.四 定义工厂类, 生成对象

public class PizzaFactory {

    public static Pizza getPizza (String type) {
        if ("chinese".equalsIgnoreCase(type)){
            return new ChinesePizza();
        }else if ("mei".equalsIgnoreCase(type)){
            return new MeiPizza();
        }else if ("eluosi".equalsIgnoreCase(type)){
            return new EluosiPizza();
        }else {
            return null;
        }
    }
}

二.五 新的创建对象方式

   @Test
    public void twoTest() {
        Pizza pizza = PizzaFactory.getPizza("chinese");
        pizza.make();

        pizza = PizzaFactory.getPizza("mei");
        pizza.make();
    }

image-20230613160502141

存在问题:

类的创建依赖于工厂类。

当新增加种类时, 需要对 getPizza(type: String) 方法进行修改,违背了开闭原因。

建议, 修改成 工厂方法模式


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

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


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

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

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

相关文章

输电线路可视化监拍装置硬件解决方案

老旧输电线路可视化监控装置 随着我国人口的增长,电力设施的规模也变得越发庞大,人工运检的负担也越来越沉重,而且巡检的时效性也是痛点,于是电网提出智慧可视化管理通道运检的方案,线路在线监测装置成为其基础&#x…

前端开发环境部署问题(高级程序员必备)

很多开发者到了一家新公司,公司发了一台新电脑,对环境安装比较困惑。今天带大家还原,拿到公司电脑,如何安装你需要的各种环境。 一、node安装 官网下载地址: http://nodejs.cn/download/ 根据自己需要下载对应的版…

电脑多久重装一次系统比较好

在长时间使用电脑后,一些用户可能会考虑重装系统来提升性能和稳定性。然而,电脑重装系统的频率是一个有争议的问题。本文将探讨电脑重装系统的最佳频率,以帮助您做出明智的决策。 工具/原料: 系统版本:win7旗舰版 品…

如何使用Leangoo领歌敏捷工具管理Sprint Backlog

什么是Sprint Backlog? Sprint Backlog是Scrum的主要工件之一。在Scrum中,团队按照迭代的方式工作,每个迭代称为一个Sprint。在Sprint开始之前,PO会准备好产品Backlog,准备好的产品Backlog应该是经过梳理、估算和优先…

编译原理期末速成-自上而下分析、消除文法的左递归问题

文章目录 自上而下分析面临的问题文法左递归问题回溯问题 构造不带回溯的自上而下分析算法消除文法的左递归 自上而下分析 自上而下就是从文法的开始符号出发,向下推导,推出句子。 面临的问题 文法左递归问题 左递归在语法分析过程中可能会导致无限循环…

测试员,自己都不上心,就不要抱怨别人对你冷眼旁观

昨日表哥恳请帮他的学生投递一下开发岗的简历,举手之劳,这忙必须得帮。但当发来学生的简历后,我吐槽了“这简历平平无奇,没有任何亮点,如何令人另眼相看?”表哥说,学生经历不多,总不…

Echarts 显示指定区域内容 + 不允许控制缩放

需求 在开发中,遇到如下一个需求,要展示指定区域的图形,并控制其不允许缩放 分析 第一想到的就是控件 dataZoom 中设置指定展示的区域,总结如下 解决 示例 源码 option: {xAxis: {type: "category",data: ["A…

医疗设备都在用哪些晶振?

医疗设备是指用于医疗诊断、治疗、监测等方面的各种设备。随着科技的不断发展,医疗设备的功能不断增强,精度和稳定性也得到了大幅提升。在这些医疗设备中,晶振是非常重要的元件之一。本文将介绍医疗设备中常用的晶振类型及其特点。 一、晶振…

Apache Kafka学习

目录 一、简介 1.概念: 2.kafka四大API: 3.Kafka消费模式 4.Kafka的基础架构 5.kafka文件存储方式 二、特性 三、优点 1.解耦 2.异步处理 3.流量削峰 4.数据持久化 5.顺序保证 6.可恢复性 四、名词解释 五、QA Q:如何保证数据高可靠、不…

RK3288 Android8.1添加lvds以及gt9触摸屏(一)

我们公司的屏幕是分为两部分 1.lvds负责屏幕亮起,显示UI 2.gt9触摸屏负责触摸点击反馈操作 现在先说lvds如何配置 RK的LVDS屏调试,主要是配置正确LVDS的dts,配置正确基本都是可以点亮的 1 首先拿到LVDS屏厂商给的屏规格书,规格…

微信小程序开发大坑盘点

微信小程序开发大坑盘点 起因 前几天心血来潮,想给学校设计个一站式校园小程序,可以查询成绩,考试信息,课表之类的(本来想法里是还想包括一些社交功能的,但这个因为资质问题暂且搁置了)。其实…

原生态Ajax价绍与使用方法

目录 什么是Ajax? 什么是原生态Ajax? Ajax使用方法与步骤 步骤: 代码示例: 什么是Ajax? 当谈到Ajax(Asynchronous JavaScript and XML)时,我们指的是一种用于在网页上进行异步…

效率低?不灵活?别担心,试试低代码应用开发平台,一招搞定!

在日常办公中,你有没有遇到办公效率低下、表格制作不灵活等常见问题?在大数据时代,这样的问题在现代化办公环境中经常遇到,也成为了大众头疼问题之一。要想解决这个问题,可以了解低代码应用开发平台,它的灵…

【六一儿童节】九九乘法表

文章目录 前言循环嵌套循环结语 前言 非常感谢您点进来这篇特殊的文章,时间匆匆,不知不觉已来到了自己的第三十余个儿童节。 很开心,小时候节日在学校和小朋友们一起玩耍,后来长大了又和兄弟们一起疯。很幸运!现在还有公司带着我们…

思否黑马圆满收官,28 支队伍创意使用 Jina AI 三款 AIGC 装备!

上周末,杭州被 AI 热潮所沸腾!SegmentFault AI Hackathon 杭州站暨思否 11 周年特别活动在 G5 创投中心拉开帷幕,超过 30 支团队参加了 32 小时的极限编程挑战,他们的产品展示直击评委的心,其中 28 支队伍得到了 Jina …

Windows/Linux搭建Stable Diffusion WebUI

什么是Stable Diffusion WebUI?能用来干嘛? Stable Diffusion WebUI(以下简称SD)是一个基于Gradio库的Stable Diffusion的浏览器界面,可以方便地配置和生成AI绘画作品,并且进行各种精细地配置。Stable Dif…

如何挂载企业邮箱网盘到windows本地

西部数码的企业邮箱网盘支持本地挂载功能,可以不用任何客户端,方便的将企业邮箱的个人网盘和企业网盘挂载到本机,并像本地硬盘一样使用,支持复制、粘贴、删除、改名等操作,将极大的方便用户对网盘文件的使用&#xff0…

grpc 实现grpc gateway(window环境)

官网:https://grpc-ecosystem.github.io/grpc-gateway/ github:https://github.com/grpc-ecosystem/grpc-gateway grpc gateway的原理官网有介绍。总结一下就是: gRPC-Gateway帮助你同时以gRPC和RESTful风格提供你的API。grpc-gateway旨在为您…

从零开始 Spring Boot 39:循环依赖

从零开始 Spring Boot 39:循环依赖 图源:简书 (jianshu.com) 什么是循环依赖 我们看一个例子: Component public class Person {private Dog pet;public Person(Dog pet) {this.pet pet;} }Component public class Dog {private Person o…

《项目实战》 Jenkins 与 CICD、发布脚本

前言 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释…