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

embedded/2024/9/23 13:26:51/

目录标题

  • 抽象工厂设计模式详解
    • 1. 介绍
    • 2. 结构
    • 3. 实现步骤
      • 3.1 创建抽象产品接口
      • 3.2 创建具体产品类
      • 3.3 创建抽象工厂接口
      • 3.4 创建具体工厂类
    • 4. 好处与优点
    • 5. 坏处与缺点
    • 6. 适用场景
    • 7. 总结

抽象工厂设计模式详解

1. 介绍

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的接口,而无需指定它们具体的类。抽象工厂模式与工厂方法模式相比,不仅仅是针对单一产品的创建,而是针对产品族的创建,即相关联的产品组合。

2. 结构

抽象工厂模式的主要结构包括以下几个角色:

  • 抽象工厂(AbstractFactory):声明一组用于创建一系列产品对象的方法,每个方法对应一个具体产品组合。
  • 具体工厂(ConcreteFactory):实现抽象工厂接口,负责创建具体产品对象。
  • 抽象产品(AbstractProduct):声明一组产品对象的接口。
  • 具体产品(ConcreteProduct):实现抽象产品接口,是工厂方法模式中具体创建的对象。

3. 实现步骤

下面以一个简单的示例来说明抽象工厂模式的实现过程,假设我们有两种类型的产品族:形状(Shape)和颜色(Color),每种产品族有对应的两种具体产品。

3.1 创建抽象产品接口

// Shape.java
public interface Shape {void draw();
}// Color.java
public interface Color {void fill();
}

3.2 创建具体产品类

// Circle.java
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}// Square.java
public class Square implements Shape {@Overridepublic void draw() {System.out.println("画一个正方形");}
}// Red.java
public class Red implements Color {@Overridepublic void fill() {System.out.println("填充红色");}
}// Blue.java
public class Blue implements Color {@Overridepublic void fill() {System.out.println("填充蓝色");}
}

3.3 创建抽象工厂接口

// AbstractFactory.java
public interface AbstractFactory {Shape createShape();Color createColor();
}

3.4 创建具体工厂类

// ShapeFactory.java
public class ShapeFactory implements AbstractFactory {@Overridepublic Shape createShape() {return new Circle();}@Overridepublic Color createColor() {return new Red();}
}// ColorFactory.java
public class ColorFactory implements AbstractFactory {@Overridepublic Shape createShape() {return new Square();}@Overridepublic Color createColor() {return new Blue();}
}

3.5 客户端使用

// Client.java
public class Client {public static void main(String[] args) {AbstractFactory shapeFactory = new ShapeFactory();Shape shape = shapeFactory.createShape();Color color = shapeFactory.createColor();shape.draw();color.fill();AbstractFactory colorFactory = new ColorFactory();Shape shape2 = colorFactory.createShape();Color color2 = colorFactory.createColor();shape2.draw();color2.fill();}
}

4. 好处与优点

  • 产品族一致性:抽象工厂模式能够确保所创建的产品都属于同一产品族,保证了产品之间的兼容性。
  • 易于替换:由于具体工厂负责创建一整个产品族,所以可以轻松地替换整个产品族,而无需修改客户端代码。
  • 符合单一职责原则:每个具体工厂只负责创建一种产品族,符合单一职责原则。

5. 坏处与缺点

难以扩展新的产品族:抽象工厂模式在增加新的产品族时,需要修改抽象工厂接口及所有具体工厂类,对系统的扩展性有一定影响。

增加了系统复杂度:引入了更多的类和接口,增加了系统的复杂度,适用于较复杂的场景。

6. 适用场景

抽象工厂模式适用于以下场景:

  • 需要创建一系列相关或依赖对象的产品族,并希望这些产品族之间保持一致性。
  • 系统有多个产品族,但每次只使用其中一个产品族。
  • 客户端不依赖于产品的创建细节,只关心产品的接口。

7. 总结

抽象工厂模式是一种常见且实用的设计模式,通过提供一组相关产品的创建接口,保证了产品族的一致性,同时也降低了客户端与具体产品的耦合度。在设计系统时,根据具体需求选择合适的设计模式能够提高代码的可维护性和可扩展性。

在这里插入图片描述


http://www.ppmy.cn/embedded/30266.html

相关文章

【中断】【ARM64】学习总结

optee中的异常向量表解读–中断处理解读 https://mp.weixin.qq.com/s/gBsy4YDYTHGRsy2zcVr6Vg

Apache DolphinScheduler支持Flink吗?

随着大数据技术的快速发展,很多企业开始将Flink引入到生产环境中,以满足日益复杂的数据处理需求。而作为一款企业级的数据调度平台,Apache DolphinScheduler也跟上了时代步伐,推出了对Flink任务类型的支持。 Flink是一个开源的分…

笨蛋学C++【C++基础第九弹】

C基础第八弹 5.C模板函数模板类模板 6.C预处理器#define 预处理参数宏条件编译# 和 ## 运算符C 中的预定义宏 7.C信号处理signal() 函数raise() 函数 5.C模板 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码 函数模板 语法: …

Golang Colly爬取图片gorm存储数据

语言:Golang 库:Iris/Colly/gorm 运行结果 text/html; charset=utf-8 It is image 20240429222029_0_0.jpg Saved file: images\20240429222029_0_0.jpg text/html; charset=utf-8 It is image 20240429222030_1_0.jpg Saved file: images\20240429222030_1_0.jpg It is ima…

清新优雅、功能强大的后台管理模板 | 开源日报 No.238

soybeanjs/soybean-admin Stars: 7.0k License: MIT soybean-admin 是一个基于 Vue3、Vite5、TypeScript、Pinia、NaiveUI 和 UnoCSS 的清新优雅且功能强大的后台管理模板。 使用最新流行的技术栈,如 Vue3、Vite5 和 TypeScript。采用清晰的项目架构,易…

C# Solidworks二次开发:枚举应用实战(第十一讲)

大家好,今天继续介绍我们的枚举应用系列。 下面是今天要介绍的枚举值: (1)第一个为swsPVResultCombinationError_e,这个枚举值的含义为结合压力容器设计研究结果时的错误,下面是官方的具体枚举值&#xf…

Debian操作系统的常用指令介绍

Debian是一个流行的Linux操作系统,以其稳定性和安全性而闻名。对于Debian用户来说,掌握一些基本的命令行指令是非常重要的,因为它们可以帮助你更高效地管理系统。在这篇博客中,我们将介绍一些在Debian系统中常用的指令及其功能。 …

【Spring】Spring全面详解(二)--什么是spring spring的三大核心概念?(超详细建议收藏慢慢看)

Spring 文章目录 Spring第四章1、Aop---面向切面编程通知类型**1、前置通知****2、后置通知****3、异常通知**4、环绕通知目前存在的问题解决方案【解决方案1:配置自动代理】【解决方案2:配置声明式代理】【解决方案3:采用注解的方式配置代理】第五章1、spring与mybatis集成…