设计模式——工厂三兄弟之抽象工厂

1.业务需求

​ 大家好,我是菠菜啊。今天给大家介绍工厂三兄弟最后一个兄弟——抽象工厂。老规矩,在介绍这期抽象工厂模式前,我们先来看看这样的需求:现在有俩个制造工厂,都要生产冰箱产品,并且客户在使用冰箱产品能够随意切换制造厂商,我们该怎么设计?
在这里插入图片描述

2.代码实现

实现初步思路:

​ 上一章我们学习了工厂方法模式(看这篇文章前可以先回顾《设计模式——工厂三兄弟之工厂方法》这篇),所有我们有了第一版思路。

工厂方法模式:

在这里插入图片描述

实现代码结构图
在这里插入图片描述

IFactory接口:

public interface IFactory {public IIceboxProduct createIceboxProduct();
}

HRFactory类:

public class HRFactory implements IFactory {@Overridepublic IIceboxProduct createIceboxProduct() {return new HRIceboxProduct();}
}

MDFactory类:

public class MDFactory implements IFactory {@Overridepublic IIceboxProduct createIceboxProduct() {return new MDIceboxProduct();}
}

IIceboxProduct(冰箱产品)接口:

//冰箱产品
public interface IIceboxProduct {//制冷public void freezing(Object things);//保鲜public void keeepFresh(Object things);}

HRIceboxProduct类:

public class HRIceboxProduct implements IIceboxProduct {@Overridepublic void freezing(Object things) {System.out.println("海尔冰箱食物制冷");}@Overridepublic void keeepFresh(Object things) {System.out.println("海尔冰箱食物保鲜");}
}

MDIceboxProduct类:

public class MDIceboxProduct implements IIceboxProduct {@Overridepublic void freezing(Object things) {System.out.println("美的冰箱食物制冷");}@Overridepublic void keeepFresh(Object things) {System.out.println("美的冰箱食物保鲜");}
}

client类:

public class Client {public static void main(String[] args) {//IFactory factory=new HRFactory();IFactory factory=new MDFactory();IIceboxProduct icebox=factory.createIceboxProduct();icebox.freezing("冷饮");icebox.keeepFresh("水果");}
}

思考:上述代码是按照工厂方法模式来设计的,如果我们想把海尔冰箱换成美的冰箱,只要修改IFactory factory=new MDFactory()这里即可,让工厂子类决定实例化哪个冰箱产品,工厂方法使一个类的实例化延迟到其子类

3.需求升级

这个俩个工厂现在不单单生产冰箱,还要生产空调,那么该怎么实现呢? 很简单,直接增加相应的产品不就行了。

实现代码结构图

在这里插入图片描述

IFactory接口:

public interface IFactory {public IIceboxProduct createIceboxProduct();//新增空调产品制造接口public IAirConditionerProduct createAirConditionerProduct();
}

HRFactory类:

public class HRFactory implements IFactory {@Overridepublic IIceboxProduct createIceboxProduct() {return new HRIceboxProduct();}//新增海尔空调产品制造实现@Overridepublic IAirConditionerProduct createAirConditionerProduct() {return new AirConditionerProduct();}
}

MDFactory类:

public class MDFactory implements IFactory {@Overridepublic IIceboxProduct createIceboxProduct() {return new MDIceboxProduct();}//新增美的空调产品制造实现@Overridepublic IAirConditionerProduct createAirConditionerProduct() {return new MDAirConditionerProduct();}
}

IAirConditionerProduct接口:

public interface IAirConditionerProduct {//制冷public void makeCold();//制热public void makeHot();}

HRAirConditionerProduct类:

public class HRAirConditionerProduct implements IAirConditionerProduct {@Overridepublic void makeCold() {System.out.println("海尔空调制冷");}@Overridepublic void makeHot() {System.out.println("海尔空调制热");}
}

MDAirConditionerProduct类:

public class MDAirConditionerProduct implements IAirConditionerProduct {@Overridepublic void makeCold() {System.out.println("美的空调制冷");}@Overridepublic void makeHot() {System.out.println("美的空调制热");}
}

client类:

public class Client {public static void main(String[] args) {//IFactory factory=new HRFactory();IFactory factory=new MDFactory();IIceboxProduct icebox=factory.createIceboxProduct();icebox.freezing("冷饮");icebox.keeepFresh("水果");//新增空调产品IAirConditionerProduct airConditioner=factory.createAirConditionerProduct();airConditioner.makeCold();airConditioner.makeHot();}
}

思考:抽象工厂接口新增空调产品制造接口,海尔和美的工厂新增空调产品制造实现。新增空调产品抽象接口,新增美的和海尔具体空调产品类。这种设计模式是一种新的设计模式——抽象工厂模式

4.定义和组成结构

抽象工厂模式(Abstract Factory Pattern)是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。它是工厂方法模式**的一个升级,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

产品等级以及产品族概念:

在这里插入图片描述

主要角色和工厂方法模式基本上是一样的,但抽象工厂中方法个数是多个,抽象产品的个数也是多个。

  • 抽象工厂(AbstractFactory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 CreateProduct() 来创建产品。
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(AbstractProduct):定义了产品的规范,描述了产品的主要特性和功能。(有多个产品级)
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间多对一

在这里插入图片描述

5.优缺点以及应用场景

优点:

  • 产品使用者和创建者解耦,无须知道产品的具体创建过程,延续了简单工厂和工厂方法创建者和使用者的分离的优点
  • 增强了代码的可扩展性,尤其是增加一个新的产品族,满足开闭原则
  • 产品族切换通过使用不同的具体工厂类,保证使用者始终只使用同一个产品族中的对象

缺点:

  • 每增加一个新的产品等级就需要修改工厂的抽象层和实现层代码,增加了系统维护成本,违反了开闭原则
  • 引入了多个抽象和具体类,增加了系统的复杂度和理解难度

适用场景:

  • 使用者只知道创建产品的工厂名,而不知道具体的产品名
  • 创建的对象是一系列相互关联或相互依赖的产品族
  • 系统中有多个产品族,但是每次只使用一个产品族

现实应用场景:

  • JDBC:数据库连接技术,使用了抽象工厂模式来提供一个标准的接口,可以通过不同的工厂实现类来获取适用于不同数据库类型的 Connection、Statement、ResultSet 等对象,以便实现在不同数据库中切换

  • Spring中的BeanFactory:在 Spring 中,BeanFactory 是用于管理 Bean 的一个工厂,所有工厂都是 BeanFactory 的子类。这样我们可以通过 IOC 容器来管理访问 Bean,根据不同的策略调用 getBean() 方法,从而获得具体对象。

    在这里插入图片描述

6.工厂三兄弟小结

简单工厂模式适用于创建简单的对象,对象之间有相似的创建过程。工厂方法模式在简单工厂基础上对工厂类进行了抽象,将具体的产品对象创建延迟到具体的工厂子类中,并加入了开闭原则,有一定的可扩展性。抽象工厂模式工厂方法模式基础上提出产品族的概念,一个工厂能生产同一个产品族的产品。

【个人链接

微信公众号:
请添加图片描述

你的收藏和点赞就是我最大的创作动力,关注我我会持续输出更新!

友情提示:请尊重作者劳动成果,如需转载本博客文章请注明出处!谢谢合作!

【作者:我爱吃菠菜 】

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

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

相关文章

Java 内存泄露风险

目录 内存泄露的定义 潜在的内存泄露场景 未关闭的资源类 未正确实现 equals() 和 hashCode() 非静态内部类 重写了 finalize() 的类 针对长字符串调用 String.intern() ThreadLocal 的误用 类的静态变量 虽然 Java 程序员不用像 C、C 程序员那样时刻关注内存的使用情…

蚂蚁技术日首次开放,精彩看点分享

每年的 5 月 27 日,是蚂蚁的技术日,用来鼓励蚂蚁技术人保持敬畏和创新之心,到今天,第九届“527 蚂蚁技术日”已发展成为技术周,成为蚂蚁技术人的嘉年华。 2015 年 5 月 27 日,因为光纤被挖断,全…

国产身份域管架构图集合(信创政策AD域替换必看)

几类典型架构 双机架构 单点单机房 集群架构 多点单机房 两地三中心架构 多点多机房 多地分布式架构 多点多机房 全栈信创方案架构,欢迎探讨交流~

React useContext源码分析

React 框架中 useContext Hook 用于数据的传递,组件的数据传递有几种方式,通过 props、状态管理 和 useContext。本文将讲述useContext 在 React 是如何工作的,创建一个简单的 Context 例子并根据源码进行 Debug: 创建 context …

剖析【C++】——类和对象(下篇)——超详解——小白篇

目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 2. Static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 3.3总结: 4. 内部类 1.概念 2.特性 示例代码: 代码分析 3.总结 5.再次理解类和对象 …

MySQL各种锁

目录 1. 从粒度上区分锁 1.1 全局锁(第一粒度) 1.2 表级锁(第二粒度) 1.3 行锁(第三最小粒度) 2 从模式上区分锁 2.1 什么是乐观锁 2.2 什么是悲观锁 2.3 意向共享锁和意向排他锁 2.4 临键锁和记录…

autocad背景色、引线文字大小

一、改变背景 在命令行输入op,回车,弹出配置对话框: 二、改变引线文字大小 选中引线,右键选择【特性】,在文字选项卡中设置文字高度:

Linux学习笔记:日志文件的编写

日志文件Log.hpp 日志文件的作用简单的日志文件编写 日志文件的作用 日志文件可以很好的帮我们显示出程序运行的信息,例如,进程pid,运行时间,运行状况等,通过日志记录程序的执行路径、变量值、函数调用等,可以帮助我们快速定位和修复代码中的错误。 简单的日志文件…

磁盘配额的具体操作

磁盘配额: linux的磁盘空间有两个方面:第一个是物理空间,也就是磁盘的容量 第二个inode号耗尽,也无法写入 linux根分区:根分区的空间完全耗尽,服务程序崩溃,系统也无法启动了。 为了防止有人…

JavaWeb 请求响应路径调试

在使用mvc时&#xff0c;或许会遇到请求的页面响应不了&#xff0c;这种情况要对站下径。 站点根目录 启动服务器时&#xff0c;通常要知道哪个是站点根目录。相应在网页端的url的跟站点通常为http://localhost:8080/ &#xff0c;前端解析时用的是站点根目录。 <form act…

【嵌入式DIY实例】-OLED显示网络时钟

OLED显示网络时钟 文章目录 OLED显示网络时钟1、硬件准备与接线2、代码实现在上一个ESP8266 NodeMCU文章中,我们用DS3231 RTC芯片和SSD1306 OLED制作了一个简单的实时时钟,时间和日期显示在SSD1306屏幕上,并且可以通过两个按钮进行设置。 在本中,我们将使用ESP 8266 NodeMC…

【Gradle】Gradle的本地安装和使用

目录 1、Gradle 的安装 2、集成 IntelliJ IDEA 3、使用 Gradle Gradle 完全兼容 Maven 和 Ivy 仓库&#xff0c;你可以从中检索依赖也可以发布你的文件到仓库中&#xff0c;Gradle 提供转换器能把 Maven 的构建逻辑转换成 Gradle 的构建脚本。 1、Gradle 的安装 Gradle 的…

Python 将Word、Excel、PDF、PPT文档转为OFD文档

OFD&#xff08;Open Fixed-layout Document &#xff09;是我国自主制定的一种开放版式文件格式标准。OFD文档具有不易被篡改、格式独立、版式固定等特点&#xff0c;目前常用于政府公文、金融、电子发票等领域。 如果想要通过Python将Office文档&#xff08;如Word、Excel或…

Android 车载 Audio 中 有关系统按键无声的问题排查小结

本文简单记录一下&#xff0c;车载中系统按键音的问题排查从 App --> FrameWork --> HAL层 的问题排查。 通过日志分析&#xff1a; AudioStreamOutSink 这个有数据写入到 HAL 中&#xff08;方式一&#xff09; 查看 dump 文件。&#xff08;方式二&#xff09; 先 …

SAP 物料的与压缩库存数据不一致

在测试系统中进行501和561增加库存的时候,系统提示物料的预压缩库存数据不一致的报错。 如下图所示: 首先想到的就是搜SAP的NOTES,找到了相关的两个note:293356 note:2197042 表示:数据库表 ACDOCA 和 ACDOCA_M_EXTRACT 之间的差异。 经过查询发现是由于物料分类账中的…

Docker 图形化界面管理工具 Portainer | 让你更轻松的管理 Docker

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Portainer 是一个 Docker 图形化管理工具&#xff0c;可以通过 Web UI 轻松的管理容器、镜像、网络、卷。与 Dockge 相比功能更加的完善&#xff0c;同时上手难度也更大一些 Portainer 分为社区版和商业版…

你是否正确地编写了 Git 提交信息?

介绍 在版本控制方面&#xff0c;Git 是一个非常有效的工具。然而&#xff0c;像任何其他工具一样&#xff0c;你必须正确使用它才能充分发挥其作用。你需要考虑不同的方面。本文着重介绍如何按照传统提交规范&#xff08;Conventional Commits specification&#xff09;编写…

线上商城API接口再次升级||电商API接口对接线上商城搭建

功能更新 商城对接【蚂蚁搬客】应用 API接口产品上传及订单状态修改 01 商城对接API应用 ▼ 使用场景 适用于多个电商平台&#xff08;如淘宝、京东、天猫、1688、苏宁、唯品会、当当等&#xff09;的产品搬家&#xff0c;包括产品标题、主图等信息&#xff0c;轻松完成商…

NFTScan 获 Google Cloud 战略支持!

近日&#xff0c;NFT 数据基础设施服务商 NFTScan 获得全球领先云计算服务提供商 Google Cloud 战略支持。未来&#xff0c;双方将在链上数据和区块链领域展开战略合作&#xff0c;高效联动&#xff0c;共同探索区块链技术的更多可能性&#xff0c;为用户和行业带来更多惊喜与成…

束测后台实操文档2-OpenWrt

束测后台实操文档1-PVE、PBS 上面文&#xff0c;把proxmox装好并添加好PBS上的镜像存储空间后&#xff0c;还原已经做好的镜像基本上就可以在已有的镜像下开展工作了。 调试的PVE环境一般两个网口&#xff0c;一个外网wan&#xff0c;一个子网lan&#xff0c;虚拟机一般在lan…