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

当今用于探测和阻止无人机的 10 种反无人机技术 利用反无人机技术应对无人机威胁。 阅读详情

相关推荐

CST实战:变容二极管电容曲线提取全流程(附S参数设置技巧)

本文详细介绍了在CST Studio Suite中提取变容二极管电容-电压(C-V)曲线的完整实战流程。重点解析了S参数仿真的核心原理、DCFEED模块的正确配置、参数扫描的设置技巧,并探讨了集成SPICE模型进行精确仿真的方法,帮助射频工程师高效、准确地获取器件关键特性。

weixin_29237635的博客 529

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

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

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

告别游戏卡关!用Cheat Engine 7.5修改单机游戏数据的保姆级教程(附Tutorial靶场练习)

本文提供了一份详细的Cheat Engine 7.5使用教程,帮助玩家轻松修改单机游戏数据。从基础操作到高级技巧,包括精确值扫描、模糊扫描、指针扫描和代码注入,教程还涵盖了《植物大战僵尸》和《星露谷物语》的实战案例,确保玩家能够安全、高效地优化游戏体验。

weixin_30082367的博客 782

抽象工厂模式-Abstract Factory Pattern

抽象工厂模式-Abstract Factory Pattern

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

远程桌面连接失败?手把手教你解决CredSSP加密Oracle漏洞(Win10/Win11通用)

本文详细解析了Windows远程桌面连接因CredSSP加密Oracle漏洞安全更新导致的“身份验证错误”问题。文章从原理入手,提供了通过组策略编辑器(适用于专业版)和注册表编辑器(适用于家庭版)两种核心解决方案,指导用户将安全策略调整为推荐的“缓解”模式,以在保障安全的前提下恢复连接,并给出了高级脚本处理与安全最佳实践。

u6v7w8x的博客 724

linux下docker 部署onlyoffice社区版

Onlyoffice 是一款功能丰富的在线 Office 工具,类似 WPS 和 微软的 Office 套件。OnlyOffice Workspace 是由 OnlyOffice 推出的基于云计算的企业级在线协作办公平台,由文档服务(Document Server)、控制面板(Control Panel)、社区服务(Community Server)和邮件服务(Mail Server)四个组件构成,提供了文档、项目、成员、邮件等功能模块,支持文档多人协作、历史版本控制等功能,旨在帮助用户提高工作效率和工作质

axiaowua的博客 2382

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

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

kaven 4903

石油化工软件:ProII二次开发_(9).案例研究:ProII二次开发实例

我们将上述三个步骤整合到一个完整的案例中,展示如何从头到尾实现一个ProII二次开发项目。这个项目包括自动化流程模拟、数据处理与分析以及动态工艺参数调整。

kkchenjj的博客 918

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

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

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

华为OD机试 - 不含101的数(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。小明在学习二进制时,发现了一类不含101的数,也就是:现在给定一个正整数区间,请问这个区间内包含了多少个不含101的数?输入的唯一一行包含两个正整数。输出的唯一一行包含一个整数,表示在区间内一共有几个不含101的数。8 1668 → “1000”

学Java,找哪吒 1250

华为OD技术面八股_C++_05

汇总华为OD技术面C++方向技术面八股文,提供详细解答。

qq_45776114的博客 413

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

含分布式电源的配电网三段式电流保护影响仿真研究

文章摘要 本文研究了分布式电源(DG)接入对配电网三段式电流保护的影响。通过在Matlab/Simulink平台搭建含同步发电机型DG的10kV配电网模型,设计了基于傅里叶算法的三段式电流保护模块(I段瞬时速断、II段限时速断、III段定时限过流)。研究分析了不同DG接入位置、容量及故障点对保护系统的影响机理。仿真结果表明,DG接入会改变故障电流特性,可能导致三种典型问题:保护范围扩大引起误动、保护灵敏度下降导致拒动,以及保护选择性丧失。该研究为含DG配电网的保护配置与整定提供了理论依据和仿真参考,对保障分

huanghm88的专栏 268

抽象工厂模式(Abstract Factory Pattern)

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

u013115157的博客 946

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

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

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

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

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

一、概述 二、适用chang

小吕丶Code阶区 3847

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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、付费专栏及课程。

余额充值