理解抽象工厂设计模式

目录

  • 抽象工厂模式
    • 抽象工厂模式结构
    • 抽象工厂模式适合应用场景
    • 抽象工厂模式优缺点
    • 练手题目
      • 题目描述
      • 输入描述
      • 输出描述
      • 提示信息
      • 题解

抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

抽象工厂模式结构

在这里插入图片描述

  1. 抽象产品(Abstract Product)为构成系列产品的一组不同但相关的产品声明接口。

  2. 具体产品(Concrete Product)是抽象产品的多种不同类型实现。所有变体都必须实现相应的抽象产品。

  3. 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象产品的方法。

  4. 具体工厂 (Concrete Factory)实现抽象工厂的构建方法。每个具体工厂都对应特定产品变体,且仅创建此种产品变体。

  5. 尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品。这样,使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。客户端 (Client)只需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/产品变体交互。

抽象工厂模式通用代码

// 抽象工厂接口声明了一组能返回不同抽象产品的方法。这些产品属于同一个系列
// 且在高层主题或概念上具有相关性。同系列的产品通常能相互搭配使用。系列产
// 品可有多个变体,但不同变体的产品不能搭配使用。
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂可生成属于同一变体的系列产品。工厂会确保其创建的产品能相互搭配
// 使用。具体工厂方法签名会返回一个抽象产品,但在方法内部则会对具体产品进
// 行实例化。
class ConcreteFactory1 implements AbstractFactory {public ProductA createProductA() {return new ProductA1();}public ProductB createProductB() {return new ProductB1();}
}class ConcreteFactory2 implements AbstractFactory {public ProductA createProductA() {return new ProductA2();}public ProductB createProductB() {return new ProductB2();}
}// 系列产品中的特定产品必须有一个基础接口。所有产品变体都必须实现这个接口。
interface ProductA {// ProductA specific methods
}class ProductA1 implements ProductA {// ProductA1 specific methods or fields
}class ProductA2 implements ProductA {// ProductA2 specific methods or fields
}interface ProductB {// ProductB specific methods
}class ProductB1 implements ProductB {// ProductB1 specific methods or fields
}class ProductB2 implements ProductB {// ProductB2 specific methods or fields
}//客户端
public class Client {public static void main(String[] args) {// 选择一个具体的工厂实现AbstractFactory factory = null;if (conditionForFactory1) {factory = new ConcreteFactory1();} else {factory = new ConcreteFactory2();}// 使用工厂对象来创建产品ProductA productA = factory.createProductA();ProductB productB = factory.createProductB();//调用方法等}
}

抽象工厂模式适合应用场景

  1. 如果代码需要与多个不同系列的相关产品交互,但是由于无法提前获取相关信息,或者出于对未来扩展性的考虑,你不希望代码基于产品的具体类进行构建,在这种情况下,你可以使用抽象工厂。

  2. 如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。

  3. 在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。

在这里插入图片描述

识别方法: 我们可以通过方法来识别该模式——其会返回一个工厂对象。 接下来, 工厂将被用于创建特定的子组件。

抽象工厂模式优缺点

抽象工厂模式优点:

  • 你可以确保同一工厂生成的产品相互匹配。

  • 你可以避免客户端和具体产品代码的耦合。

  • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。

  • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。

抽象工厂模式的缺点: • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

练手题目

题目描述

小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。

输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示订单的数量。

接下来的 N 行,每行输入一个字符串,字符串表示家具的类型。家具类型分为 “modern” 和 “classical” 两种。

输出描述

对于每个积木,输出一行字符串表示该积木的信息。

对于每笔订单,输出字符串表示该订单需要生产家具的信息。

modern订单会输出下面两行字符串

modern chair

modern sofa

classical订单会输出下面两行字符串

classical chair

classical soft

在这里插入图片描述

提示信息

在示例中,工厂收到了3笔订单,其中有2笔要求生产modern风格,1笔要求生产classical风格。根据输入的类型,每次订单生产的家具信息被输出到控制台上。

题解

示例代码:

import java.util.Scanner;// 定义一个家具工厂接口,可以创建椅子和沙发
interface FurnitureFactory{Chair createChair();Sofa createSofa();
}// 实现古典家具工厂,生产古典风格的椅子和沙发
class ClassicalFurnitureFactory implements FurnitureFactory{@Overridepublic Chair createChair(){return new ClassicalChair();}@Overridepublic Sofa createSofa(){return new ClassicalSofa();}
}// 实现现代家具工厂,生产现代风格的椅子和沙发
class ModernFurnitureFactory implements FurnitureFactory{@Overridepublic Chair createChair(){return new ModernChair();}@Overridepublic Sofa createSofa(){return new ModernSofa();}
}// 定义椅子接口,包含生产椅子的方法
interface Chair{void produceChair();
}// 实现古典椅子类,继承椅子接口
class ClassicalChair implements Chair{@Overridepublic void produceChair(){System.out.println("classical chair");}
}// 实现现代椅子类,继承椅子接口
class ModernChair implements Chair{@Overridepublic void produceChair(){System.out.println("modern chair");}
}// 定义沙发接口,包含生产沙发的方法
interface Sofa{void produceSofa();
}// 实现古典沙发类,继承沙发接口
class ClassicalSofa implements Sofa{@Overridepublic void produceSofa(){System.out.println("classical sofa");}
}// 实现现代沙发类,继承沙发接口
class ModernSofa implements Sofa{@Overridepublic void produceSofa(){System.out.println("modern sofa");}
}public class Main{public static void main (String[] args) {Scanner scanner = new Scanner(System.in);// 创建古典和现代家具工厂实例FurnitureFactory classicalFurnitureFactory = new ClassicalFurnitureFactory();FurnitureFactory modernFurnitureFactory = new ModernFurnitureFactory();// 读取生产次数int productionCount = scanner.nextInt();scanner.nextLine();for (int i = 0; i < productionCount; i++) {String type = scanner.nextLine();// 根据用户输入选择相应的家具工厂,并创建家具FurnitureFactory factory = (type.equals("modern")) ? modernFurnitureFactory : classicalFurnitureFactory;Chair chair = factory.createChair();chair.produceChair(); Sofa sofa = factory.createSofa();sofa.produceSofa(); }scanner.close();}
}

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

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

相关文章

自定义一个MyBaits脱敏插件

自定义一个MyBaits脱敏插件 用于对查询结果中的敏感数据进行脱敏处理。这个插件将拦截ResultSetHandler对象的处理结果&#xff0c;对某些敏感字段进行脱敏。 插件实现步骤 创建脱敏插件类。注册插件。 1. 创建脱敏插件类 首先&#xff0c;我们创建一个自定义插件类 DataM…

深入理解策略梯度算法

策略梯度&#xff08;Policy Gradient&#xff09;算法是强化学习中的一种重要方法&#xff0c;通过优化策略以获得最大回报。本文将详细介绍策略梯度算法的基本原理&#xff0c;推导其数学公式&#xff0c;并提供具体的例子来指导其实现。 策略梯度算法的基本概念 在强化学习…

【Python3的内置函数和使用方法】

目录 Python 特点 Python 中文编码 Python 变量类型 Python列表 Python 元组 元组是另一个数据类型&#xff0c;类似于 List&#xff08;列表&#xff09; Python 字典 Python数据类型转换 Python 运算符 Python算术运算符 Python比较运算符 Python赋值运算符 Pyt…

一篇就够了,为你答疑解惑:锂电池一阶模型-离线参数辨识(附代码)

锂电池一阶模型-参数离线辨识 背景模型简介数据收集1. 最大可用容量实验2. 开路电压实验3. 混合动力脉冲特性实验离线辨识对应模型对应代码总结下期预告文章字数有点多,耐心不够的谨慎点击阅读。 下期继续讲解在线参数辨识方法。 背景 最近又在开始重新梳理锂电池建模仿真与S…

使用stat()函数的例子

代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h>int main(void) {struct stat st;if(-1stat("test.txt",&st)){printf("获得文件状态失败\n");return -1;}printf(&q…

Unidbg调用-补环境V2

1.B站 内部依赖自定义的SignedQuery对象,需要找到apk中的类并补充环境。 package com.nb.demo;import com.github.unidbg.AndroidEmulator

llama3模型部署时遇到的问题及解决方案

在llama3模型部署时&#xff0c;会遇到一系列问题&#xff0c;这里就作者所遇到的问题与解决方法分享一下。 注意&#xff1a;这里是从llama3 github主页上给的方法一步步做的&#xff0c;不适用于其他部署大模型的方法。 文章目录 ERROR 403&#xff1a;Forbidden安装依赖时出…

洛谷 P1548 [NOIP1997 普及组] 棋盘问题

题目 洛谷 P1548 [NOIP1997 普及组] 棋盘问题 [NOIP1997 普及组] 棋盘问题 题目背景 NOIP1997 普及组第一题 题目描述 设有一个 N M N \times M NM 方格的棋盘 ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) (1≤N≤100,1≤M≤100) (1≤N≤100,1≤M≤100) 求出该棋盘中包含有多少个正…

MySQL高级-MVCC-undo log 版本链

文章目录 1、undo log2、undo log 版本链2.1、然后&#xff0c;有四个并发事务同时在访问这张表。2.1.1、修改id为30记录&#xff0c;age改为32.1.2、修改id为30记录&#xff0c;name改为A32.1.3、修改id为30记录&#xff0c;age改为10 2.2、总结 1、undo log 回滚日志&#xf…

文件系统(操作系统实验)

实验内容 &#xff08;1&#xff09;在内存中开辟一个虚拟磁盘空间作为文件存储器&#xff0c; 在其上实现一个简单单用户文件系统。 在退出这个文件系统时&#xff0c;应将改虚拟文件系统保存到磁盘上&#xff0c; 以便下次可以将其恢复到内存的虚拟空间中。 &#xff08;2&…

数字孪生煤矿智能化综合管控平台

煤矿可视化通过图扑 HT 实现实时数据集成和三维建模仿真&#xff0c;呈现井下环境、设备状态和生产状况等多维度数据&#xff0c;帮助管理人员进行直观监控和精准分析。该技术提升了运营效率和安全水平&#xff0c;为煤矿作业提供了智能化的管理解决方案&#xff0c;有助于减少…

黑马点评DAY1|Redis入门、Redis安装

什么是Redis&#xff1f; redis是一种键值型数据库&#xff0c;内部所存的数据都是键值对的形式&#xff0c;例如&#xff0c;我们可以把一个用户数据存储为如下格式&#xff1a; 键值id$1600name张三age21 但是这样的存储方式&#xff0c;数据会显得非常松散&#xff0c;因…

云计算HCIE+RHCE学员的学习分享

大一下学期&#xff0c;我从学长嘴里了解到誉天教育&#xff0c;当时准备考RHCE&#xff0c;我也了解了很多培训机构&#xff0c;然后学长强烈给我推荐誉天&#xff0c;我就在誉天报名了RHCE的课程。 通过杨峰老师的教学&#xff0c;我学到了许多Linux知识&#xff0c;也了解了…

笔记本电脑部署VMware ESXi 6.0系统

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统&#xff08;Windows 11升级不了&#xff1f;但Win10就要停服了啊&#xff01;来&#xff0c;我教你&#xff01;&#xff09;&#xff0c;也介绍了…

【单片机毕业设计选题24037】-基于STM32的电力系统电力参数无线监控系统

系统功能: 系统上电后&#xff0c;OLED显示“欢迎使用电力监控系统请稍后”&#xff0c;两秒后显示“Waiting..”等待ESP8266初始化完成&#xff0c; ESP8266初始化成功后进入正常页面显示&#xff0c; 第一行显示电压值&#xff08;单位V&#xff09; 第二行显示电流值&am…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越&#xff0c;也能承认自己平庸&#xff0c;不要低估3&#xff0c;5&#xff0c;10年沉淀的威力 hi 大家好&#xff0c;我是大师兄&#xff0c;大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间&#xff0c;不太可能一蹴而就&…

VMware虚拟机迁移:兼用性踩坑和复盘

文章目录 方法失败情况分析&#xff1a;参考文档 方法 虚拟机关机&#xff0c;整个文件夹压缩后拷贝到新机器中&#xff0c;开机启用即可 成功的情况&#xff1a; Mac (intel i5) -> Mac (intel i7)Mac (intel, MacOS - VMware Fusion) -> DELL (intel, Windows - VMw…

Zynq7000系列FPGA中的DMA控制器简介(二)

AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信&#xff0c;以控制数据流。这意味着从设备可以请求DMA交易&#xff0c;以便将数据从源地址传输到目标地址。 虽然DMAC在技术…

mysql5.7安装使用

mysql5.7安装包&#xff1a;百度网盘 提取码: 0000 一、 安装步骤 双击安装文件 选择我接受许可条款–Next 选择自定义安装&#xff0c;下一步 选择电脑对应的系统版本后(我的系统是64位)&#xff0c;点击中间的右箭头&#xff0c;选择Next 选择安装路径–Next 执行…

matlab可以把图像数据转换为小波分析吗

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…