当前位置: 首页 > news >正文

抽象工厂模式

目录

了解抽象工厂模式前的前置知识

什么是抽象工厂模式?

为什么要提出抽象工厂模式?

抽象工厂模式中的四大角色?

抽象工厂模式的优缺点?

抽象工厂模式的适用场景?


了解抽象工厂模式前的前置知识

       在讲抽象工厂模式之前,想要明确两个概念。

        一个概念是产品族,还有一个概念是产品等级结构。

        1)产品族:产品族是指同一个工厂产生的,位于不同产品等级结构中的一组产品。比如小米工厂生产的小米手机、小米电脑、小米音响构成一个产品族。这三种产品属于不同的产品等级结构,但是由同一个工厂创建。

        2)产品等级结构:产品等级结构即产品的继承结构,如一个手机父类,其子类有小米手机、华为手机、苹果手机等。手机类是父类,小米手机类、华为手机类、苹果手机类是子类。

什么是抽象工厂模式?

        抽象工厂模式是创建型模式,提供了创建一系列相关的或者相互依赖的对象接口,而无须指明具体类。

为什么要提出抽象工厂模式?

       1)由于工厂方法模式的缺点:因为简单工厂模式的工厂职责过重,而且不满足开闭原则,所以有了工厂方法模式。而工厂方法模式又由于每个工厂只生产一类产品,可能导致系统中有大量的工厂类,增加系统开销,此时我们考虑可以将相关的产品构成一个产品族放在同一个工厂生产,进而引入了抽象工厂模式。

        2)由于实际需要。有时候我们需要让一个工厂可以提供多个产品对象,而不是一个工厂对应单一的产品对象。

        

抽象工厂模式中的四大角色?

        1)抽象工厂:定义了一个接口或者是抽象类,声明了一组用于创建相关产品对象的方法,这些方法的返回值通常是抽象产品。

        2)具体工厂:它实现了抽象工厂中创建对象的方法,根据不同参数,创建具体产品对象。

        3)抽象产品类:定义了一个接口或者是抽象类,表示同类产品,在抽象产品类中声明该产品具有的方法。

        4)具体产品类:它定义了抽象产品下的具体产品,实现了抽象产品类中的声明的方法。

        还有一个可选的隐藏角色是工厂创造器:根据传入不同的工厂类型,创造一个具体的工厂类,返回值用抽象工厂接受。

抽象工厂模式的优缺点?

        优点:

                1)将产品的创建和使用分离开来,用户并不需要知道创建过程的细节,这使得客户端代码变得整洁。

                2)容易替换产品系列。由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同产品配置。

                3)当一个族中的多个对象被设计到一起工作的时候,可以保证客户端使用的都是同一个产品族的对象。

        缺点:

                1)产品族扩展非常困难。在产品族需要增加新的产品等级的时候,需要修改抽象工厂的代码以及具体工厂的实现。严重违反了“开闭原则”。

                2)增加了代码的复杂性和抽象性,增加了代码理解难度。

        

抽象工厂模式的适用场景?

        1)需要创建对象和使用分离时,并不关心具体的创建过程。系统需要对一个产品族下的不同产品提供统一的访问接口,而不关心具体的实现过程。

        2)系统有多于一个的产品族,而在使用时需要动态选择产品族。

        3)产品等级结构稳定,设计完后不会在向系统中添加新的产品等级结构或者删除已有的产品等级结构。

        4)系统需要让一组产品被设计到一起使用,而不是单独设计。

相关文章:

抽象工厂模式

目录 了解抽象工厂模式前的前置知识 什么是抽象工厂模式? 为什么要提出抽象工厂模式? 抽象工厂模式中的四大角色? 抽象工厂模式的优缺点? 抽象工厂模式的适用场景? 了解抽象工厂模式前的前置知识 在讲抽象工厂模式…...

登录校验-Filter-详解

目录 执行流程 拦截路径 过滤器链 小结 执行流程 过滤器Filter拦截到请求之后,首先执行方放行之前的逻辑,然后执行放行操作(doFilter),然后会访问对应的Web资源(对应的Controller类)&#…...

堆栈方法区笔记记录

成员变量分两种: 1)实例变量:没有static修饰,属于对象,存储在堆中,有几个对象就有几份,通过对象点来访问 2)静态变量:由static修饰,属于类,存储在方法区中,只有一份,通过类名点来访…...

新版微信小程序获取用户手机号

小程序手机号验证组件有两种 手机号快速验证组件 //原生写法 <button open-type"getPhoneNumber" bindgetphonenumber"getPhoneNumber"></button>Page({getPhoneNumber (e) {console.log(e.detail.code)} })uniapp写法 <button open-type…...

CSS实践 —— 悬浮盒子阴影加上移效果

悬浮盒子阴影加上移效果 代码 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title><style>body{background-color: #f5f5f5;}.shadow {width: 100px;height: 100px;margin:…...

安全测试基础知识

软件安全测试是评估和测试系统以发现系统及其数据的安全风险和漏洞的过程。没有通用术语&#xff0c;但出于我们的目的&#xff0c;我们将评估定义为分析和发现漏洞&#xff0c;而不尝试实际利用这些漏洞。我们将测试定义为发现和尝试利用漏洞。 安全测试通常根据要测试的漏洞…...

列表首屏毫秒级加载与自动滚动定位方案

引用自 摸鱼wiki 场景 <template><div ref"commentsRef"><divv-for"comment in displayComments":key"comment.id":data-cell-id"comment.id"class"card">{{ comment.data }}</div></div> &…...

小区物业业主管理信息系统设计的设计与实现(论文+源码)_kaic

摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方向而改变&#xff0c;所以纯人工管理方式在越来越完善的现代化管理技术的比较之下也就显得过于繁琐&#x…...

Fortran 微分方程求解 --ODEPACK

最近涉及到使用Fortran对微分方程求解&#xff0c;我们知道MATLAB已有内置的函数&#xff0c;比如ode家族&#xff0c;ode15s&#xff0c;对应着不同的求解办法。通过查看odepack的官方文档&#xff0c;我尝试使用了dlsode求解刚性和非刚性常微分方程组。 首先是github网址&am…...

8路光栅尺磁栅尺编码器或16路高速DI脉冲信号转Modbus TCP网络模块 YL99-RJ45

特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数&#xff0c;频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数&#xff0c;可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…...

【Python】函数

None类型 思考&#xff1a;若函数没有使用return语句返回数据&#xff0c;那么函数有返回值吗&#xff1f; 答&#xff1a;实际上是有的&#xff0c;Python中有一个特殊的字面量None&#xff0c;其类型是<class ‘NoneType’>&#xff0c;无返回值的函数&#xff0c;实…...

centos安装MySQL 解压版完整教程(按步骤傻瓜式安装

一、卸载系统自带的 Mariadb 查看&#xff1a; rpm -qa|grep mariadb 卸载&#xff1a; rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 二、卸载 etc 目录下的 my.cnf 文件 rm -rf /etc/my.cnf 三、检查MySQL是否存在 有则先删除 #卸载mysql服务以及删除所有mysql目录 #没…...

【后端速成 Vue】第一个 Vue 程序

1、为什么要学习 Vue&#xff1f; 为什么使用 Vue? 回想之前&#xff0c;前后端交互的时候&#xff0c;前端收到后端响应的数据&#xff0c;接着将数据渲染到页面上&#xff0c;之前使用的是 JavaScript 或者 基于 JavaScript 的 Jquery&#xff0c;但是这两个用起来还是不太…...

Macbook pro M1 安装Ubuntu教程

先讲下心路历程 由于版主最近刚切换到Mac&#xff0c;所以在安装的时候一上手就选择了virutalbox&#xff0c;结果报错“The installer has detected an unsupported architecture. VirtualBox only runs on the amd64 architecture.” 后来去Reddit论坛上一看&#xff0c;才知…...

前端console.log打印内容与后端请求返回数据不一致

后端传值num0 前端打印num1 ,如图&#xff0c;console.log后台显示的数据与展开后不一致 造成该问题原因是深拷贝与浅拷贝的问题。 var obj JSON.parse(JSON.stringify(res)) 修改后打印 正常...

SQL入门:多表查询

SQL&#xff0c;或者说结构化查询语言(Structured Query Language)&#xff0c;是用于管理和操作关系型数据库的标准语言。在本篇文章中&#xff0c;我们将重点介绍SQL中的多表查询&#xff0c;这是一种强大的工具&#xff0c;可以帮助我们从多个相关的表格中获取数据。 数据库…...

【C++】进一步认识模板

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、非类型模板参数二、模板的特…...

Mysql Oracle 区别

1. oracle select *, id需要在星号前加别名&#xff0c;mysql则不需要 mysql语法&#xff1a; select *, id from xin_student_t;oracle语法&#xff1a; select st.*, st.id from xin_student_t st;2. oracle表定义了别名&#xff0c;在查询时可以不用别名指定字段&#xf…...

华为OD-第K长的连续字母字符串长度

题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 代码实现 # coding:utf-8 # 第K长的连续字母字符串长度 # https://www.nowcoder.com/discuss/353150…...

【编程题】有效三角形的个数

文章目录 一、题目二、算法讲解三、题目链接四、补充 一、题目 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例1&#xff1a; 输入: nums [2,2,3,4] 输出: 3 **解释:**有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 …...

【mysql是怎样运行的】-EXPLAIN详解

文章目录 1.基本语法2. EXPLAIN各列作用1. table2. id3. select_type4. partitions5. type 1.基本语法 EXPLAIN SELECT select_options #或者 DESCRIBE SELECT select_optionsEXPLAIN 语句输出的各个列的作用如下&#xff1a; 列名描述id在一个大的查询语句中每个SELECT关键…...

数据结构例题代码及其讲解-链表

链表 单链表的结构体定义及其初始化。 typedef struct LNode {int data;struct LNode* next; }LNode, *LinkList;①强调结点 LNode *p; ②强调链表 LinkList p; //初始化 LNode* initList() {//定义头结点LNode* L (LNode*)malloc(sizeof(LNode));L->next NULL;return …...

[Open-source tool] 可搭配PHP和SQL的表單開源工具_Form tools(1):簡介和建置

Form tools是一套可搭配PHP和SQL的表單開源工具&#xff0c;可讓開發者靈活運用&#xff0c;同時其有數個表單模板和應用模組供挑選&#xff0c;方便且彈性。Form tools已開發超過20年&#xff0c;為不同領域的需求者或開發者提供一個自由和開放的平台&#xff0c;使他們可建構…...

移动数据业务价值链的整合

3G 时代移动数据业务开发体系的建立和发展&#xff0c;要求运营商从封闭、统一的业 务形态、单一提供业务&#xff0c;向开放的、个性化多元化的业务体系以及多方合作参与提 供业务的方向发展&#xff0c;不可避免的使通信价值链不断延长和升级&#xff0c;内容提供商、服务 …...

合并两个链表

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 比如以下例子&#xff1a; 题目接口&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListN…...

测试框架pytest教程(9)跳过测试skip和xfail

skip无条件跳过 使用装饰器 pytest.mark.skip(reason"no way of currently testing this") def test_example(faker):print("nihao")print(faker.words()) 方法内部调用 满足条件时跳过 def test_example():a1if a>0:pytest.skip("unsupported …...

HTML <textarea> 标签

实例 <textarea rows="3" cols="20"> 收拾收拾 </textarea>定义和用法 <textarea> 标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来…...

探索图结构:从基础到算法应用

文章目录 理解图的基本概念学习图的遍历算法学习最短路径算法案例分析&#xff1a;使用 Dijkstra 算法找出最短路径结论 &#x1f389;欢迎来到数据结构学习专栏~探索图结构&#xff1a;从基础到算法应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;I…...

Redis之GEO类型解读

目录 基本介绍 基本命令 geoadd 命令 geopos 命令 geodist 命令 georadius 命令 georadiusbymember 命令 geohash 命令 基本介绍 GEO 主要用于存储地理位置信息&#xff08;纬度、经度、名称&#xff09;添加到指定的key中。该功能在 Redis 3.2 版本新增。 GEO&…...

uniapp 微信小程序 路由跳转

保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面 //在起始页面跳转到test.vue页面并传递参数 uni.navigateTo({url: test?id1&name"lisa" }); uni.redirectTo(OBJECT) 关闭当前页面&#xff0c;跳转到应用…...

专门做地图的网站/app制作公司

114. 二叉树展开为链表 2022.01.02 本题链接 1.在此之前刚好写一下二叉树的存储结构&#xff1a;顺序存储结构、链式存储结构 ①顺序存储结构&#xff1a; 建议从数组下标1开始存储。 #define MAxsize 50 struct TreeNode{ElemType value;bool isEmpty; };TreeNode t[Ma…...

seo实训报告/山西seo推广

关注点&#xff1a; 1、指定日期上一月份的获取 2、取两月份间的所有月份清单 3、mysql小表数据在hive上的插入装载 4、Hive汇总数据向mysql插入 1、Hive临时表及mysql目标表的准备 Hive临时表&#xff1a; drop table if exists xxx_anchor_bringnew_detail_min; CREATE TAB…...

企业网站一般用什么程序做/北京seo排名收费

背景 采购新的GPU后&#xff0c;就有赶紧尝鲜的冲动 GeForce RTX 3090 项目尝试 准备尝试ASR中文项目&#xff1a; https://github.com/nl8590687/ASRT_SpeechRecognition​github.com 然后天真以为很香、很简单。根据项目的介绍&#xff0c;安装了tensorflow 1.13。再根据…...

wordpress竞争/b站推广怎么买

项目介绍 一款 PHP 语言基于 Laravel5.8、Layui、MySQL等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架&#xff0c;可用于快速搭建前后端分离后台管理系统&#xff0c;本着简化开发、提升开发效率的初衷&#xff0c;框架自研了一套个性化的组件&…...

网站通知模板/网站访问量

话说自动化测试方面的工具还是非常的多的&#xff0c;不可能也没有必要查看了所有的测试工具&#xff1b;个人觉得当学习众多同类知识或相关主题时&#xff0c;分几步走&#xff1a; 1、学习所有同类知识的共同理论、原理部分【此为共性】 2、学习所有同类知识的独有特性、技…...

淄博做网站公司有哪些/营销的方法手段有哪些

对于getOutputStream()&#xff0c;api里是这样说的&#xff1a;Either this method or getWriter() may be called to write the body, not both. 也就是getOutputStream()和getWriter() 只能使用一个&#xff0c;把代码里的response.getOutputStream()全部删之后&#xff0…...