抽象工厂模式和工厂模式的区别

1. 工厂模式(Factory Method Pattern)
工厂模式是为创建对象提供一个接口,让子类决定实例化哪一个类。工厂模式通过将实例化的过程延迟到子类,从而实现对象创建的灵活性。

  • 核心思想:定义一个创建对象的接口,但由子类来具体决定要实例化哪一个类。
  • 特点:关注的是“创建某一种类的对象”,它解决的是不同子类中如何实例化对象的细节问题。
结构:
  • 抽象工厂类:声明创建产品的方法。
  • 具体工厂类:实现创建产品的方法。
  • 产品接口:定义产品的共同接口。
  • 具体产品类:实现产品接口的具体类。
示例:
// 产品接口
interface Product {void use();
}// 具体产品类
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品类
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 工厂接口
interface Factory {Product createProduct();
}// 具体工厂类A
class FactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂类B
class FactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}

在工厂模式中,每个具体工厂负责生产一种具体产品。你可以通过选择不同的工厂来创建不同的产品。


2. 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种更复杂的设计模式,它允许你创建一组相关的对象,而不是单个对象。抽象工厂提供一个接口,能够创建一系列相关或依赖的对象,而无需指定它们的具体类。

  • 核心思想:提供一个创建一组相关或相互依赖对象的接口,而无需指定具体类。
  • 特点:不仅能创建一个产品,还能创建一组产品,这组产品通常有某种关联或依赖关系
结构:
  • 抽象工厂接口:定义创建一组相关对象的方法。
  • 具体工厂类:实现创建具体产品的方法。
  • 抽象产品接口:为每个产品类提供接口。
  • 具体产品类:实现抽象产品接口的具体类。
示例:
// 抽象产品A接口
interface ProductA {void use();
}// 抽象产品B接口
interface ProductB {void consume();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {@Overridepublic void use() {System.out.println("Using Product A1");}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {@Overridepublic void use() {System.out.println("Using Product A2");}
}// 具体产品B1
class ConcreteProductB1 implements ProductB {@Overridepublic void consume() {System.out.println("Consuming Product B1");}
}// 具体产品B2
class ConcreteProductB2 implements ProductB {@Overridepublic void consume() {System.out.println("Consuming Product B2");}
}// 抽象工厂接口
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}

在抽象工厂模式中,每个具体工厂负责生产一系列相关的产品(如 ProductAProductB),而不仅仅是单一的产品。


应用场景的不同

工厂模式的应用场景:
  • 当你只需要创建某一种产品的实例,而不需要创建其他类型的相关产品时。
  • 你希望由子类来决定实例化哪个具体产品。
  • 适合简单场景,如根据用户输入或配置文件决定创建哪种产品。
例子:
  • 文件解析器:根据文件类型(如 .txt, .pdf)来创建不同的解析器对象。
抽象工厂模式的应用场景:
  • 当你需要创建一组相互关联或相互依赖的对象时。
  • 系统的产品不仅仅是一个,而是一族产品,且系统需要避免产品之间的不兼容性。
  • 适合复杂场景,如产品系列需要一起工作或与其他产品协作。
例子:
  • 跨平台 UI 库:不同平台(如 Windows 和 macOS)需要一套相关联的 UI 组件(如按钮、菜单等)。抽象工厂可以为每个平台创建一组相关的 UI 组件。

总结:

  • 工厂模式适用于创建单一产品,关注的是如何创建一个对象。
  • 抽象工厂模式适用于创建一组相关产品,关注的是如何创建多个相关对象并保持其兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148118.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

思维商业篇(5)—发展趋势分析

思维商业篇(5)—发展趋势分析 核心理论 巴菲特曾在《滚雪球》一书中提到他的投资之道其实非常简单,可以总结为两句话:找到足够长的雪道,找到足够湿的雪球。 而发展趋势的分析,正好可以借助巴菲特的这个滚雪球理论。 足够长的雪…

内存和管理

在 C 中,对象拷贝时编译器可能会进行一些优化,以提高程序的性能。 一种常见的优化是“返回值优化(Return Value Optimization,RVO)”和“具名返回值优化(Named Return Value Optimization,NRV…

“明月寄情,文化共融”iEnglish助力青少年用英语讲述中国故事

在全球化日益加深的今天,文化的交流与融合成为了不可阻挡的趋势。中秋节,这一承载着中华民族深厚文化底蕴与家国情怀的传统节日,正通过新的方式走向世界舞台。今年中秋,在斐济、澳大利亚、法国等多个国家的中秋文化活动中&#xf…

电脑桌面文件太多太杂?电脑管理软件一键整理,强迫症福音!

电脑桌面文件太多太杂?随着工作量的增加和信息的不断累积,许多人的电脑桌面上往往堆满了各式各样的文件和文件夹,显得杂乱无章。这种“桌面乱象”不仅影响了工作效率,还可能给心理带来不必要的压力,尤其对于那些有强迫…

【RTT-Studio】详细使用教程十六:DAC7311外部DAC使用

文章目录 一、简介二、驱动程序三、DAC设置注册四、完整代码五、测试验证 一、简介 8 位 DAC5311、10 位 DAC6311 和 12 位 DAC7311 (DACx311) 是低功耗、单通道、电压输出数模转换器 (DAC)。DACx311 在正常工作状态下具有低功耗(5V 时为 0.55mW,断电模式…

【Qt笔记】QStackedWidget控件详解

目录 引言 一、基础功能 二、属性设置 2.1 属性介绍 2.2 代码示例 2.3 代码解析 三、常用API 3.1 添加子部件 3.2 插入子部件 3.3 移除子部件 3.4 设置当前页面索引值 3.5 设置当前显示子部件 3.6 返回索引处子部件指针 3.7 返回子部件索引值 四、信号与槽 4.…

蓝牙AOA基站助力打造智慧医院管理系统

随着科技的飞速发展,智慧医院的概念逐渐深入人心。其中,蓝牙AOA(到达角)定位技术以其高精度、低功耗、低成本等优势,在智慧医院建设中扮演着重要角色。本文将深入探讨蓝牙AOA基站如何助力智慧医院的建设与发展。 一、蓝…

Linux C高级 day4

一、思维导图 二、练习 1、统计家目录下.c文件的个数 #!/bin/bashcount0 for file in ~/*.cdo((count)) done echo $count 2、定义一个稀疏数组(下标不连续),写一个函数,求该稀疏数组的和,要求稀疏数组中的数值通过参数传递到函数中。arr(…

【例题】证明极限

已知&#xff1a; ∀ ε > 0 , ∃ n > N , ∣ a n − A ∣ < ε \forall \varepsilon >0, \exist n>N,|a_n-A|<\varepsilon ∀ε>0,∃n>N,∣an​−A∣<ε 目标&#xff1a; ∀ ε > 0 , ∃ n > N 1 , ∣ a 1 . . . a n n − A ∣ < ε \…

codeforces round974 div3 分层图 树形dp

A Robin Helps 问题&#xff1a; 思路&#xff1a;模拟 代码&#xff1a; #include <bits/stdc.h> using namespace std;const int N 2e5 10;void solve() {int n, k;cin >> n >> k;vector<int> a(n 1);for(int i 1; i < n; i ) cin >&…

9.23 My_string.cpp

my_string.h #ifndef MY_STRING_H #define MY_STRING_H#include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; //字符串的最大容量int len; //字符串当前…

车载视频监控:安全生产与管理的新趋势

随着社会的快速发展&#xff0c;车载视频监控技术已成为现代安防领域不可或缺的一部分。车载视频监控设备是专为车载安防设计的新型视频监控设备&#xff0c;其安装已经成为社会发展的必然趋势。对于企业的安全生产和管理来说&#xff0c;车载视频监控设备起着至关重要的作用。…

wpf,工具栏上,最小化按钮的实现

工具栏上&#xff0c;最小化按钮的实现。工具栏做成的是用户控件。 用户控件的xaml <Button HorizontalAlignment"Right" Height"32" Click"MinimizeClick" /> 用户控件的cs代码 private void MinimizeClick(object sender, RoutedEven…

2024年408真题计算机网络篇

1 https://zhuanlan.zhihu.com/p/721169467。最小割可以看作是切断水流的最薄弱环节——通过切断这些关键的“水管”&#xff0c;就可以完全阻止水从源点流到汇点。 在下列二进制数字调制方法中&#xff0c;需要2个不同频率载波 的是 A. ASK B. PSK C. FSK D. DPSK 解答…

【行为树】02-基础的端口

Input and Output Ports 输入和输出端口 正如我们之前解释的那样,自定义的TreeNodes可以用于执行任意简单或复杂的软件。它们的目标是提供一个具有更高抽象层级的接口。 因此,它们在概念上与函数没有不同。 类似于函数,我们经常想要: 将参数传递给一个节点(inputs)从一…

论文Query2Label: A Simple Transformer Way to Multi-Label Classification

本文将Transformer解码器用于多标签分类&#xff0c;将label embedding作为query&#xff0c;计算与feature map的cross-attention&#xff0c;取得了SOTA结果。 论文&#xff1a;https://arxiv.org/pdf/2107.10834.pdf 代码&#xff1a;https://github.com/SlongLiu/query2lab…

洛谷-P3916 图的遍历

题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求A(v) 表示从点 v 出发&#xff0c;能到达编号最大的点。 思路 既然是要找到最大的点&#xff0c;那么我从最大的点开始DFS是否可以&#xff1f; 于是可以反向建图&#xff0c;然后从最…

Excel的基本应用 ___2

快速插入函数 方法一&#xff1a; 方法二&#xff1a;快捷键 Alt&#xff1a;求和 动态查看 利用函数清单选择函数 相对地址和绝对地址的转换 FnF4

寻觅义乌自闭症学校:了解寄宿制教育的选择

在义乌乃至全国范围内&#xff0c;为自闭症儿童寻找一所合适的学校&#xff0c;是许多家庭面临的重大挑战。随着特殊教育的发展&#xff0c;越来越多的寄宿制学校以其独特的优势和全面的教育体系&#xff0c;为这些特殊的孩子提供了更加专业和细致的关怀。今天&#xff0c;我们…

MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官

知识点思维导图 案例1 建表语句与模拟数据 用户表 users CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, signup_date DATE NOT NULL ); INSERT INTO users (username, email, signu…