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

目录标题

  • 抽象工厂设计模式详解
    • 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.mzph.cn/diannao/5182.shtml

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

相关文章

学生管理系统[Python语言]

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 学生管理系统是计算机专业最基础的一个作业&#…

算法设计优化——起泡排序

文章目录 0.概述1 起泡排序(基础版)1.1 算法分析1.2 算法实现1.3 重复元素与稳定性1.4 复杂度分析 2 起泡排序(改进版)2.1 目标2.2 改进思路2.3 实现2.4 复杂度分析 3 起泡排序(改进版2)3.1 目标3.1 改进思…

edge 入门基础了解使用

随着Windows 11的发布,Microsoft Edge也迎来了新的更新和改进。作为一名长期使用Edge的用户,我不仅注意到了这些表面的变化,还深入研究了Edge在Windows 11上的新特性和潜在优势。 快捷方式 查找框 在Microsoft Edge浏览器中,按…

C语言——通讯录实现

一、介绍 本文只是对于结构体类型的练习。 只是简单的静态通讯录实现,没有具体的UI界面,只有一些简单的功能,同时也比较粗糙,有很多地方没有经过足够的打磨。 二、源码 本项目包含三个文件: test.c/cpp #include…

Typora中设置文字颜色

在Typora中设置文字颜色的三种方法如下: 方法一:使用内联公式 开启使用内联公式。依次点击“文件”→“偏好设置”(或使用快捷键Ctrl逗号),在弹出的窗口中选择“Markdown”,然后勾选“内联公式”&#xf…

基于docker-compose使用虚拟机搭建redis集群

代码实现 新建文件 docker-compose-redis.yml,复制以下代码 version: 2.2services:redis-node1:image: redis:5.0restart: alwayscommand: redis-server --port 7000 --cluster-enabled yes --cluster-config-file /data/nodes.conf --appendonly yesports:- &quo…

智能穿戴终端设备安卓主板方案_MTK平台智能手表PCBA定制开发

新移科技智能手表方案兼容WiFi、BLE、2~5G等多种通信能力。支持多个功能模块,包括:通话、计步、定位、睡眠监测、心率监测、血氧监测等。智能手表通过滑动与功能性按键提供高度直观的体验感受,从腕间即可掌控日常生活。形态支持定制包括&…

安全架构概述

安全架构是确保网络环境中的数据、系统和用户安全的关键组成部分,它涉及到多种技术和策略的综合应用。基本内容主要包括以下几个方面: 1. 访问控制与身份验证 :确保只有经过验证的用户或系统可以访问特定资源,常用技术包括多因素…

MySQL从入门到高级 --- 4.约束

文章目录 第四章:4.MySQL约束4.1 主键约束4.1.1 添加单列主键4.1.2 添加多列主键(联合主键)4.1.3 通过修改表结构添加主键4.1.4 删除主键约束4.1.5 自增长约束特点 4.1.6 指定自增字段初始值 - 创建表时指定4.1.7 指定自增字段初始值 - 创建表之后4.1.8 delete与tru…

如何配置 Prettier 配置文件,确保其中的文件 glob 模式能够正确包含 postcss.config.js 文件

如何配置 Prettier 配置文件,确保其中的文件 glob 模式能够正确包含 postcss.config.js 文件 要配置 Prettier 以确保其文件 glob 模式能够正确包含 postcss.config.js 文件,您可以按照以下步骤操作: 确认 Prettier 配置文件的存在&#xf…

商城数据库88张表结构(十五)

DDL 57.后台权限表 CREATE TABLE wang_privileges (privilegeId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,menuId int(11) NOT NULL COMMENT 父ID,privilegeCode varchar(20) NOT NULL COMMENT 权限代码,privilegeName varchar(30) NOT NULL COMMENT 权限名称,isMenu…

websocket全局封装使用

WebSocket对象的创建 WebSocket对象的关闭 启用心跳机制,避免断连 消息推送,接收到消息后进行业务逻辑处理 重连机制,如果断连后尝试一定次数的重连,超过最大次数后仍然失败则关闭连接 调用案例如下: const socketMana…

Vue笔记 4

内置指令 1.v-text_指令 我们学过的指令: ​ v-bind : 单向绑定解析表达式, 可简写为 :xxx ​ v-model : 双向数据绑定 ​ v-for : 遍历数组/对象/字符串 ​ v-on : 绑定事件监听, 可简写为 ​ v-if : 条件渲染(动态控制节点是否存存在&#xff0…

洞察未来:数据治理中的数据架构新思维

随着大数据时代的来临,数据已经成为企业运营和社会发展的重要资产。然而,数据的复杂性和快速增长给企业带来了前所未有的挑战。在这样的背景下,数据治理成为了企业不可或缺的一环。数据治理不仅涉及数据的管理、安全和隐私保护,更…

ubuntu部署sonar与windows下使用sonar-scanner

ubuntu部署sonar与windows下使用sonar-scanner sonar部署java安装mysql安装配置sonarqube 插件安装sonar-scanner使用简单使用 sonar部署 使用的是sonarqube-7.5&#xff0c;支持的java环境是jdk8&#xff0c;且MySQL版本 >5.6 && <8.0 java安装 打开终端&…

Jackson-自定义注解及实现数据脱敏、枚举转换

Hi,大家好&#xff0c;我是抢老婆酸奶的小肥仔。 上一章&#xff0c;我们介绍了下Jackson及相关的注解&#xff0c;其实我们可以通过仿照一些注解来实现自定义以满足我们自己的业务需求&#xff0c;这一章&#xff0c;我们来说说jackson提供的自定义注解及一些应用吧。 废话不…

Virtualbox7.0.10--创建虚拟机

前言 下载Virtualbox7.0.10&#xff0c;可参考《Virtualbox–下载指定版本》 Virtualbox7.0.10具体安装步骤&#xff0c;可参考《Virtualbox7.0.10的安装步骤》 Virtualbox7.0.10创建虚拟机&#xff0c;可参考《Virtualbox7.0.10–创建虚拟机》 Virtualbox7.0.10安装Ubuntu20.0…

H.265码流解析

这一篇内容旨在对H.265码流中的一些概念做简单了解,部分概念与H.264相同,本篇中将不再重复。 1、NALU H.265(HEVC)码流的NALU结构和AVC有一些不同,属于增强版,HEVC NALU结构如下: NALU Header: Forbidden_zero_bit:1位,必须为0,如果不是则表示NALU非法;Nal_unit_t…

后端如何处理接口的重复调用

首先是&#xff0c;原理在请求接口之前&#xff0c;使用过滤器拦截数据&#xff0c;来进行判断两次数据是否一致。 1.自定义注解 2.创建一个Handler处理器 3.RepeatSubmitInterceptor的实现类 4.过滤器的配置

大型企业总分支多区域数据传输,效率为先还是安全为先?

大型企业为了业务拓展需要&#xff0c;会在全国乃至全球各地设立分公司和办事机构&#xff0c;以便更好地处理当地事务&#xff0c;并进行市场的开拓和客户维护&#xff0c;此时&#xff0c;企业内部就衍生出了新的业务需求&#xff0c;即多区域数据传输。 多区域很难准确定义&…