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 框架、数据库访问层等场景。
当你需要为不同的产品族提供一套通用的创建逻辑时,抽象工厂模式是一个非常适合的选择。

电磁兼容标准体系解析:从基础到认证的完整指南 本文系统解析了电磁兼容(EMC)标准体系,从基础概念到认证流程提供完整指南。文章阐述了EMC对于产品可靠性与市场准入的重要性,详细拆解了基础标准、通用标准、产品类标准及认证流程四层结构,并结合5G设备与工业控制等实战案例,为工程师提供了从设计初期到认证测试的高效应用策略。 阅读详情

相关推荐

Lenovo 拯救者15ISK硬件升级实战:从内存到固态硬盘的全面优化

本文详细介绍了为联想拯救者15ISK笔记本电脑进行硬件升级的完整实战指南。通过评估升级可行性,指导如何挑选兼容的内存条与NVMe固态硬盘,并提供详细的拆机安装步骤与系统安装避坑技巧。升级后,笔记本的开机速度、软件加载及多任务处理能力获得飞跃式提升,让老旧设备重获新生。

weixin_29310631的博客 554

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

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

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

保姆级教程:用Python和PyTorch复现PTB-XL心电信号分类论文(附完整代码)

本文提供了一份详细的PTB-XL心电信号分类教程,涵盖从数据预处理到模型优化的完整流程。通过PyTorch实现三种深度学习架构(Conv1D、SincNet和熵特征融合网络),并针对医疗AI特有的类别不平衡问题提供解决方案。教程包含可运行的代码示例,帮助开发者快速复现论文结果并应用于实际心电信号分析场景。

weixin_30555125的博客 405

抽象工厂模式-Abstract Factory Pattern

抽象工厂模式-Abstract Factory Pattern

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

AD创建属于自己的元件库(详细)

我今天开始学习AD2022,但是我想自己创建属于自己的元件库,但是奈何找了好多教程就是随便几句话就把我打发走了,弄了一天都没搞定(也许是我比较菜),所以现在乱懂了,自己写一个属于我们自己小白的教程,希望有用吧哈哈我比较偷懒,直接使用嘉立创上画好的元件导入,和我们自己创建自己画的步骤其实都一样。

qq_33591173的博客 2万+

Python XML 转 JSON,XML 转字典

今天我们将学习如何在 Python 中将 XML 转换为 JSON 和 XML 转换为字典。我们可以使用 Python 的xmltodict模块来读取 XML 文件并将其转换为字典或 JSON 数据。我们还可以在大型 XML 文件上进行流式处理,并将其转换为字典。在进入编码部分之前,让我们首先了解为什么需要进行 XML 转换。

rubys_的专栏 2501

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

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

kaven 4903

[V-10]ARMv8/v9-CPU Virtualization-CPU虚拟化架构简介(vCPU/vPE)

本文简要介绍了CPU虚拟化架构的基础知识。

基层架构师的分享 1267

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

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

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

深入剖析RDMA Netlink:Linux内核中高效通信的基石

RDMA Netlink:Linux内核中高效通信控制的核心机制 RDMA技术通过绕过内核实现高速数据传输,但其管理控制仍需内核参与。drivers/infiniband/core/netlink.c文件作为RDMA子系统的心脏,构建了用户空间与内核间的高效通信桥梁。该模块采用模块化客户端架构,通过全局数组管理不同类型的RDMA功能,如设备管理、连接服务和链路层操作。从最初的全局锁到细粒度读写锁的演进,展现了Linux内核追求高性能的持续优化。同时,通过条件编译支持新旧内核版本和网络命名空间,体现了稳定性与

数字人生 238

麒麟操作系统安装教程(保姆级)

本文介绍了如何在VM中安装麒麟操作系统,文章详细的介绍了麒麟操作系统按钻过步骤。

啊渊的专栏 1万+

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

OPPO 数据分析面试题及参考答案

如何设计共享单车数据库的各个字段? 对于共享单车的数据库设计,首先考虑用户相关的字段。用户表可以包含用户 ID,这是一个唯一标识符,用于区分不同用户;姓名,记录用户的真实姓名;联系方式,比如手机号码,方便在出现问题时联系用户;注册时间,记录用户何时开始使用共享单车服务;信用分数,用于衡量用户使用共享单车过程中的行为是否合规,比如是否按时归还车辆等。 车辆信息表要有车辆 ID,这是车辆的唯一标识;车辆类型,例如普通单车、电动单车等;投放时间,即车辆投放到市场的时间;车辆状态,包括是否可用(如正

大模型大数据攻城狮的专栏 1185

抽象工厂模式(Abstract Factory Pattern)

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

u013115157的博客 946

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

一、概述 二、适用chang

小吕丶Code阶区 3847

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

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

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

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

  本文章转载大佬CBF4LIFE的文章 博客地址:https://www.cnblogs.com/cbf4life/           好了,我们继续上一节课,上一节讲到女娲造人,人是造出来了,世界时热闹了,可是低头一看,都 是清一色的类型,缺少关爱、仇恨、喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋, Shit!忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类重新洗牌...

宇智波带土 207
上一篇: 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、付费专栏及课程。

余额充值