Java设计模式 四 抽象工厂模式 (Abstract Factory Pattern)

【愚公系列】二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

抽象工厂模式 (Abstract Factory Pattern) 是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式为产品族的创建提供了一个接口,其核心在于解决“产品族的扩展”和“客户端与具体工厂的解耦”。

1. 模式结构

抽象工厂模式的参与者包括以下角色:

  • AbstractFactory(抽象工厂): 定义创建一系列相关对象的接口。
  • ConcreteFactory(具体工厂): 实现抽象工厂的接口,负责创建具体产品。
  • AbstractProduct(抽象产品): 定义产品的通用接口。
  • ConcreteProduct(具体产品): 实现具体的产品接口。
  • Client(客户端): 通过抽象工厂接口使用产品,而不需要直接依赖具体产品类。

2. 抽象工厂模式的优点

  • 产品族一致性: 确保一个工厂生产的产品是同一个系列的,避免客户端混用不同系列的产品。
  • 易于扩展: 增加新的产品族时,只需要增加新的具体工厂和产品类,符合开闭原则。
  • 解耦客户端和产品: 客户端通过抽象接口使用工厂和产品,不需要关心具体实现。

3. 抽象工厂模式的缺点

  • 复杂性增加: 增加产品族需要添加多个类,可能使系统更加复杂。
  • 不支持新产品的扩展: 如果需要向已有的产品族中添加新产品,需要修改抽象工厂接口及其所有具体工厂实现,违背开闭原则。

4. 实现步骤

1) 定义抽象产品接口

定义每种产品的抽象接口,描述其功能。

// 抽象产品A
public interface ProductA {
    void use();
}

// 抽象产品B
public interface ProductB {
    void display();
}
2) 实现具体产品类

不同产品族中具体产品的实现。

// 产品族1的具体产品A
public class ConcreteProductA1 implements ProductA {
    @Override
    public void use() {
        System.out.println("Using ProductA1");
    }
}

// 产品族1的具体产品B
public class ConcreteProductB1 implements ProductB {
    @Override
    public void display() {
        System.out.println("Displaying ProductB1");
    }
}

// 产品族2的具体产品A
public class ConcreteProductA2 implements ProductA {
    @Override
    public void use() {
        System.out.println("Using ProductA2");
    }
}

// 产品族2的具体产品B
public class ConcreteProductB2 implements ProductB {
    @Override
    public void display() {
        System.out.println("Displaying ProductB2");
    }
}
3) 定义抽象工厂接口

抽象工厂定义了创建每种产品的方法。

public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}
4) 实现具体工厂类

具体工厂实现了抽象工厂接口,负责实例化具体产品。

// 产品族1的工厂
public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// 产品族2的工厂
public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}
5) 客户端代码

客户端通过抽象工厂接口创建产品,而无需关心具体实现。

public class Client {
    public static void main(String[] args) {
        // 使用工厂1创建产品族1
        AbstractFactory factory1 = new ConcreteFactory1();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        productA1.use();  // 输出: Using ProductA1
        productB1.display();  // 输出: Displaying ProductB1

        // 使用工厂2创建产品族2
        AbstractFactory factory2 = new ConcreteFactory2();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA2.use();  // 输出: Using ProductA2
        productB2.display();  // 输出: Displaying ProductB2
    }
}

5. 使用场景

  1. 产品有多个系列,且系列内的产品一起使用时:
    比如 GUI 系统中,Windows 和 MacOS 的按钮、文本框等组件需要成套使用。

  2. 需要向客户端隐藏产品的具体实现时:
    客户端只关心工厂和产品的接口,而无需了解具体产品类。

  3. 需要保证产品族的一致性时:
    确保客户端不会意外混用不同产品族的对象。


6. 抽象工厂模式的优缺点对比

优点:
  • 产品族一致性: 能够保证同一工厂创建的产品是同一个系列的。
  • 扩展产品族容易: 增加新的产品族时,只需添加新的工厂类,不需要修改现有代码。
缺点:
  • 增加新产品困难: 如果需要在产品族中添加新产品,必须修改抽象工厂接口和所有具体工厂类,不符合开闭原则。
  • 系统复杂度提高: 随着产品族的增加,类的数量和系统复杂度也会增加。

7. 与工厂方法模式的比较

特性工厂方法模式抽象工厂模式
关注点创建单一产品创建一组相关产品
新增产品新增产品时,需要新增一个具体工厂类新增产品族时,需要新增具体工厂类
新增产品类别支持新增产品类别,扩展性更好新增产品类别需要修改工厂接口,扩展性较差
复杂度相对较低较高,涉及多个产品类和工厂类

8. 总结

抽象工厂模式适用于创建一系列相关或相互依赖的对象,同时能够保证产品族的完整性和一致性。在实际开发中,抽象工厂模式广泛应用于 GUI 框架、数据库访问层等场景。
当你需要为不同的产品族提供一套通用的创建逻辑时,抽象工厂模式是一个非常适合的选择。

告别机床‘卡顿’!用C语言在STM32上实现连续小线段速度前瞻(附开源代码) 本文详细介绍了如何在STM32上使用C语言实现工业级连续小线段速度前瞻控制器,解决机床运动控制中的卡顿问题。通过轻量级算法框架设计和混合精度计算策略,显著提升加工效率和表面质量。文章包含开源代码和实战案例,帮助开发者快速掌握速度前瞻规划算法在嵌入式系统中的应用。 阅读详情

相关推荐

simulink中无迹卡尔曼(UKF)模块使用

simulink的UKF模块简单说明

qq_41059950的博客 2819

Java设计模式:创建型模式→抽象工厂模式

Java设计模式:创建型模式→抽象工厂模式详解

专注分享技术、实用优质教程、资源 1124

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

抽象工厂模式-Abstract Factory Pattern

抽象工厂模式-Abstract Factory Pattern

帕布里克沃德曼的博客 1万+

智慧矿山无人机空地一体化解决方案

未来,随着技术的不断进步和应用场景的不断拓展,智慧矿山无人机空地一体化解决方案将在矿业领域发挥更加重要的作用,为矿山的可持续发展提供更加有力的保障。该系统能够实现矿山的全方位、全天候监测与管理,提升矿山生产效率,降低安全风险,并为矿山的可持续发展提供有力支持。智慧矿山无人机空地一体化解决方案是当前矿业领域技术创新的重要方向,旨在通过集成无人机技术、物联网、大数据、人工智能等先进技术,实现矿山的智能化、高效化和安全化运营。在矿山爆破、挖掘等危险作业中,无人机可进行远程监控和指挥,降低人员安全风险。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1109

KUKA-外部自动运行模板程序——个人设计模式&思路

用于说明KUKA与西门子PLC外部自动交互模板的设计思路与使用流程

qq_39024187的博客 5607

设计模式-抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式 定义 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。 现在看不明白没关系,坚持看到最后,并且把例子看懂,再来多体会几遍就能明白了。 类型 创建型。 适用场景 应用层不依赖于产品类实例如何被创建、实现等细节。 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码。 提供一个产品类的库,所有的产品以同样的接口出现,从而使得应用...

kaven 4903

NE5532A与JRC4580在低噪声音频电路设计中的关键应用

本文深入探讨了经典运算放大器NE5532A与JRC4580在低噪声音频电路设计中的核心应用。文章从噪声模型分析入手,阐述了针对低阻抗信号源时,如何利用这两款BJT输入运放的低电流噪声特性进行优化设计。通过对比两者参数与实战守则,为设计高保真音频前级、耳机放大等电路提供了从原理图到PCB布局的完整低噪声解决方案。

weixin_29295541的博客 327

深入解析Java抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式定义了一个接口,用于创建相关的对象族,而不需要明确指定具体类。它通常包含多个工厂方法,每个工厂方法创建一类对象。通过抽象工厂,客户端可以通过调用工厂方法来创建对象,但客户端并不需要知道具体的类实现。首先,我们定义两个抽象产品类,分别代表按钮(Button)和文本框(TextField// 抽象产品1:Button// 抽象产品2:TextField// 具体产品1:WindowsButton@Override@Override// 具体产品2:MacButton。

一碗黄焖鸡三碗米饭的博客 1059

1.30 Cubemx_STM32H743 SD_Card纳入文件管理系统

Cubemx_STM32H743 SD_Card纳入文件管理系统1、简介2、CubeMX配置 1、简介 和前面文章原理其实一样的。 1.29 Cubemx_STM32F429\H743 nandflash、spifalsh纳入文件管理系统 现在一并将SD卡、NandFlash、SPIFlash一并作为文件管理。 下面直接介绍SDcard,其他参考前面文章。 2、CubeMX配置 ...

oDuanYanGuHong的博客 1079

基于pytorch cnn ResNets卷积网络的模糊图像检测 完整代码数据直接运行

基于pytorch cnn ResNets卷积网络的模糊图像检测 完整代码数据直接运行

730

DesignPattern_Java:Abstract Factory Pattern

抽象工厂模式 Abstract Factory Pattern Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类。 抽象工厂角色(Abst

Anonymous 965

ESP32S3接入讯飞在线语音识别教程及配套源代码

本文介绍了如何使用ESP32-S3开发板实现讯飞在线语音识别功能。首先,需要准备硬件设备,包括ESP32-S3开发板、麦克风模块、MicroSD卡模块和扬声器模块。接着,安装Arduino IDE并配置ESP32-S3开发环境,注册讯飞开放平台账号并获取API凭证。然后,通过I2S接口连接麦克风模块,并编写代码实现语音录制、Base64编码、API请求和识别结果处理。代码包括初始化WiFi、麦克风、系统时间,以及录制语音、发送请求、解析响应等功能。最后,通过按键触发录音,并将识别结果输出到串口。

2401_88800025的博客 746

抽象工厂模式(Abstract Factory Pattern)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决接口选择的问题。系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。在一个产品族里面,定义多个产品。在一个工厂里聚合多个同类产品。工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。

u013115157的博客 946

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】

一、概述 二、适用chang

小吕丶Code阶区 3847

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

02-Java抽象工厂模式 ( Abstract Factory Pattern )

1. 意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类2. 主要解决主要解决接口选择的问题3. 何时使用系统的产品有多于一个的产品族,而系统只消费其中某一族的产品4. 如何解决在一个产品族里面,定义多个产品5. 关键代码在一个工厂里聚合多个同类产品6. 应用实例。

深入Java世界:探索编程之美与技术深度 1735

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

23种设计模式——抽象工厂模式(Abstract Factory Pattern)详解

本文介绍了23种设计模式之——抽象工厂模式(Abstract Factory Pattern)的说明及使用

Meteors.的博客 1246

设计模式精讲 Day 3:抽象工厂模式(Abstract Factory Pattern)

在面向对象设计中,抽象工厂模式是一种用于创建一系列相关或依赖对象的接口,而无需指定它们具体的类。它属于创建型模式,是工厂方法模式的进一步抽象和扩展。本节将围绕抽象工厂模式展开,分析其核心思想、结构组成、使用场景以及在实际项目中的价值。抽象工厂模式提供了一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。它封装了多个工厂方法,使得客户端可以统一地创建不同产品的家族。核心思想:将对象的创建逻辑封装到一个工厂接口中,客户端通过调用该接口获取产品,而不是直接实例化具体类。今天,我们深入学习了。

在未来等你的专栏 1126

设计模式--抽象工厂模式【 Abstract Factory Pattern】

声明:本文从网络书籍整理而来,并非原创。上一次工厂方法模式讲到女娲造人,人是造出来了,世界热闹了,可是低头一看,都是清一色的类型,缺少关爱、仇恨、喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,Shit!忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始制造人类。由于先前的工作已经花费了很大的精力做为铺垫,也不想从头开始了,那先说人类(Product 产品类)怎

mjd的专栏 1856

2.Java设计模式-----抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory),是23种设计模式之一。抽象工厂模式是这样子定义的: 抽象工厂模式,提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。 在学习抽象工厂模式之前,最好熟悉简单工厂模式以及工厂方法模式,这样对理解抽象工厂模式会有一定帮助,而且抽象工厂模式是基于工厂方法模式而来的。如果你还没有了解到什么是简单工厂模式以及工厂方法模式...

扛麻袋的少年的博客 1455

Java设计模式——抽象工厂模式(Abstract Factory Pattern)

一、抽象工厂模式定义

奔跑8蜗牛 385

设计模式 - 创建型 - 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是一种创建型设计模式,用于生成一系列相关或依赖的对象族(如不同操作系统的UI组件),而无需指定具体类。它通过抽象接口解耦客户端与产品创建过程,确保产品兼容性并支持灵活切换产品族。核心结构包括抽象工厂、具体工厂、抽象产品和具体产品四个角色。与工厂方法模式相比,抽象工厂更适用于多产品族的复杂场景,如跨平台系统、数据库兼容等。优点是高扩展性和产品一致性,缺点是新增产品类型需修改接口。典型应用包括Java AWT、Spring框架等。

csdn_tom_168的博客 877

设计模式系列(六)抽象工厂模式(Abstract Factory Pattern)

设计模式系列(五)抽象工厂模式(Abstract Factory Pattern)     抽象工厂模式

君临天下的博客 991

【设计模式】Java设计模式——抽象工厂模式(Abstract Factory Pattern)

本文主要介绍Java设计模式——抽象工厂模式,入门级别使用

Dust_heart的博客 878

1.3 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式使得客户端可以通过使用抽象接口来创建一组相关的产品,而不是通过具体类来创建。

qq_28791753的博客 863

Java设计模式--抽象工厂模式【Abstract Factory Pattern】

在上一篇中,我们对《中餐厅》的生产模式进行了改良,不同的菜系由不同的“工厂”生产。但是我们忽略了一个很重要的问题,在生产各种菜系时,各种菜系中所使用的配料谁来生产?比如湘菜和川菜中都使用了辣椒作为配料,但是这两种辣椒品种又是不一样的。这就需要我们了解今天要介绍的“抽象工厂模式”了。        抽象工厂模式是工厂方法模式的升级,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于

CoderLover 374
上一篇: Java设计模式 三 工厂方法模式 (Factory Method Pattern)
下一篇: Java设计模式 五 建造者模式 (Builder Pattern)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8357粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值