抽象工厂方法

2023-11-15

在工厂方法中,我们可以很方便的创建一个产品继承结构下的多个产品。那么考虑这么一种情况:我们需要在工厂中创建多个不同继承结构的产品。例如皮肤库:包含按钮、文本框、选择框等多个不同的元素。Spring皮肤库包含了一组相似的按钮、文本框、选择框;扁平皮肤库包含了一组扁平化的按钮、文本框、选择框;护眼皮肤库包含了一组颜色温和护眼的按钮、文本框、选择框。在这里按钮是一个产品结构(包含了Spring按钮,扁平按钮,护眼按钮),文本框是一个产品结构,选择框是一个产品结构。而同一个皮肤库里的按钮,文本框,选择框我们称之为一个产品族。如果用工厂方法,我们需要3*3=9个工厂,每次增加一个皮肤库,我们就需要增加3个工厂。这会导致工厂类数量急剧增加,不符合需求。可以考虑用抽象工厂方法。

抽象工厂方法:定义一个创建一系列相关或相互依赖对象的接口,而无须指定它们的类。它是一种对象创建型模式
在抽象工厂模式中,每一个工厂实现类都提供了多个工厂方法以创建不同类型的产品(产品族)。抽象工厂模式是所有工厂模式中最具代表性和普遍性的模式,工厂模式可以看出是产品族只有一种产品的抽象工厂模式。

类图:这里写图片描述

工厂模式优缺点:
优点:能够很方便地增加一个产品族,只需要增加相应的产品类和一个工厂实现类。完全符合开闭原则。
缺点:不支持新增产品结构。如果需要新增一个产品结构,列如上例中需要在皮肤库中增加一个Radio单选框,那么需要在工厂接口中新增一个getRadio方法,所有的工厂实现类都要重新新增getRadio方法。稍微优化一点的做法是新增一个抽象工厂类,实现工厂接口,所有的工厂实现类都继承自抽象工厂类,而不是直接实现接口。这样只需要在抽象工厂类中新增getRadio方法就可以让所有的工厂实现类得到getRadio方法,但这样也只能得到一个公共的方法,如果需要有各种不同风格的radio,还是要在各自的工厂类中新增getRadio方法,显得很麻烦。
所以要求在设计之初就要全面考虑好产品结构,尽量不要在后期新增或减少产品结构,否则会给后期维护带来麻烦。

皮肤库的类图:
这里写图片描述
主要参考:http://blog.csdn.net/LoveLion/article/details/9319481

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象工厂方法 的相关文章

  • 基于STM32HAL库编写状态机模式

    概述 本篇文章介绍如何使用STM32HAL库 以马达转动的状态示例 来说明 项目中使用的状态模式 参考该文章链接 比较懒 基本都是照搬框架 这种写法确实在项目后续新增功能时 方便不少 还是值得学习 这样的思路 加油 技术同仁们 硬件 STM
  • 原型模式

    原型模式 根据实际案例分析原型模式的优点 浅克隆 代码示例 测试分析 深克隆 代码示例 测试 分析原型模式的优点 Spring框架中原型模式案例 业务与原型模式的落地示例 根据实际案例分析原型模式的优点 在传统模式下 假设需要克隆对象 动态
  • Java 23种设计模式的分类和使用场景

    听说过GoF吧 GoF是设计模式的经典名著Design Patterns Elements of Reusable Object Oriented Software 中译本名为 设计模式 可复用面向对象软件的基础 的四位作者 他们分为是 E
  • 工厂方法模式与抽象工厂模式

    工厂方法模式与抽象工厂模式 一 工厂方法模式 Factory Method 解决的问题 案例 实现步骤 代码示例 比较冗余 只是看设计模式的思想 根据案例分析工厂方法模式 JDK源码中的工厂方法模式 二 抽象工厂模式 Abstract Fa
  • 简单工厂模式

    定义 定义一个工厂类 它可以根据传入的参数返回不同类的实例 被创建的类实例通常都具有相同的父类 因为在简单工厂模式中返回所创建的类实例的方法是静态方法 所以简单工厂模式也称为静态工厂模式 简单工厂方法的要点在于 你只需要传入一个正确的参数
  • 设计模式学习书籍推荐(设计模式书籍你读过哪几本)

    概述 想成为大神级别的攻城狮 就读以下这些书籍吧 让你从小白到大神 写出有灵魂程序 进阶之路 始于行动 编程重在理解加多实践 在当今快速发展的时代 要学会站在巨人的肩膀上 吸取经验 看书就是最快与最低成本的进阶之路 史上没有最好的书籍 只有
  • 设计模式复习(七)-------适配器模式

    1 定义 将一个类的接口转换成客户希望的另一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 设计模式 GoF 适配 即在不改变原有实现的基础上 将原先不兼容的接口转换为兼容的接口 Adapter模式很像货
  • 职责链模式

    职责链模式 职责链模式概述 职责链模式解决的问题 角色分析 职责链模式优点 代码示例 源码中的职责链模式使用案例 业务与设计模式落地案例 职责链模式概述 职责链模式解决的问题 案例 一个贷款审批案例 假设贷款额度小于5万时由客户负责人审核放
  • 设计模式之自己实现动态代理

    基于前一篇设计模式之代理模式 我们来深入分析下JDK动态代理是如何实现的 并自己实现JDK动态代理 github代码 github动态代理代码 老铁 如果喜欢可以给看小星星 谢谢 1 JDK动态代理原理分析 1 通过被代理对象的引用 利用反
  • 设计模式——解释器模式

    解释器模式 解释器模式是什么 解释器模式解决什么问题 解释器模式实现 解释器模式是什么 给定一个语言 定义它的文法的一种表示 并定义一个解释器 这个解释器使用该表示来解释语言中的句子 解释器模式解决什么问题 如匹配字符串的正则表达式 解释器
  • 第06篇 开闭原则

    一 定义 开闭原则 Open Closed Principle OCP 一个软件实体应当对扩展开放 对修改关闭 即软件实体应尽量在不修改原有代码的情况下进行扩展 开闭原则是面向对象的可复用设计的第一块基石 它是最重要的面向对象设计原则 二
  • 二十三种设计模式第二十一篇--解释器模式

    解释器模式 Interpreter Pattern 是一种行为设计模式 它用于定义一种语言的语法结构和解释器 使得可以解释并执行特定的语法规则 该模式可以将复杂的语言表达式分解为更小的语法单元 并定义其解释过程 解释器模式的核心组成部分包括
  • 抽象工厂方法

    在工厂方法中 我们可以很方便的创建一个产品继承结构下的多个产品 那么考虑这么一种情况 我们需要在工厂中创建多个不同继承结构的产品 例如皮肤库 包含按钮 文本框 选择框等多个不同的元素 Spring皮肤库包含了一组相似的按钮 文本框 选择框
  • 二十三种设计模式第十九篇--命令模式

    命令模式是一种行为设计模式 它将请求封装成一个独立的对象 从而允许您以参数化的方式将客户端代码与具体实现解耦 在命令模式中 命令对象充当调用者和接收者之间的中介 这使您能够根据需要将请求排队 记录请求日志 撤销操作等 命令模式的核心组成部分
  • 软件设计七大原则

    文章目录 一 开闭原则 定义 实现方法 二 里氏替换原则 定义 实现方法 三 依赖倒置原则 定义 实现方法 四 单一职责原则 定义 实现方法 五 接口隔离原则 定义 实现方法 六 迪米特法则 定义 实现方法 七 合成复用原则 定义 实现方法
  • 设计模式(八)----创建型模式之建造者模式与工厂模式区别

    1 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方式 而建造者模式注重的是部件构建的过程 意在通过一步一步地精确构造创建出一个复杂的对象 我们举个简单例子来说明两者的差异 如要制造一个超人 如果使用工厂方法模式 直接产生出
  • 设计模式概述

    设计模式的重要性 以实际工作举例 给用户开 开发完成后客户增加新的功能 例如原本程序适配两个产品 增加第三个产品 程序可扩展性 程序开发完成后的后续维护 规范性 可读性 总结 高内聚 低耦合 可维护性 可扩展性 类与类之间的关系 依赖 类A
  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • 外观设计模式

    外观设计模式 根据实际案例分析外观模式 Facade 示例 业务与设计模式落地案例 根据实际案例分析外观模式 Facade 案例 假设一个放电影功能 在播放电影时 需要放下窗帘 打开空调 打开播放机 打开音响 考虑用户观影时间较长时 提供暂

随机推荐

  • CMMI 级别中和BUG率

    关于CMMI 级别中和BUG率相关的信息如下 千行代码缺陷率 bug率 CMM1级 11 95 CMM2级 5 52 CMM3级 2 39 CMM4级 0 92 CMM5级 0 32 基本属于成倍递减 国内通过CMMI 5 级评定的IT行业
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • C/C++编程题刷题:leetcode 62. 不同路径 和 63. 不同路径 II

    62 不同路径 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同的路径 例如 上图是一个7 x
  • Filter(过滤器)常见应用

    javaweb学习总结 四十六 Filter 过滤器 常见应用 一 统一全站字符编码 通过配置参数charset指明使用何种字符编码 以处理Html Form请求参数的中文问题 1 package me gacl web filter 2
  • 【深度学习】Faster R-CNN+win10+tensorflow1.12.0+python3.6+CUDA9.0+cudnn7.3配置

    Faster R CNN win10 tensorflow1 12 0 python3 6 CUDA9 0 cudnn7 3配置 一 源码下载 二 修改 lib 下部分文件 编译Cython模块 三 安装COCO API 四 下载数据 五
  • 【Leetcode】225. 用队列实现栈

    题目描述 请你仅使用两个队列实现一个后入先出 LIFO 的栈 并支持普通栈的全部四种操作 push top pop 和 empty 实现 MyStack 类 void push int x 将元素 x 压入栈顶 int pop 移除并返回栈
  • Selenium+Firefox的自动下载(去掉下载弹窗)

    Selenium Firefox的自动下载 去掉下载弹窗 一 去掉下载弹窗的优点 二 去掉下载弹窗的一般命令 三 重点 一 去掉下载弹窗的优点 检索键盘鼠标自动化控制模块的导入 可以无头化运行 不影响同时进行的其他的任务 二 去掉下载弹窗的
  • Apache Avro 文档概况

    文章主题来源于英文源文档 gt Apache Avro 1 11 0 文档 Apache Avro 1 11 0 Documentation 1 介绍 Apache Avro 是一个数据序列化 data serialization 框架 A
  • CentOS 7 下安装Chrome浏览器

    参考 http www cnblogs com hfyfpga p 6261819 html http blog csdn net johnnyhu90 article details 42127521 如果出现如下错误 curl 7 Fa
  • rust类型转换

    类型转换 类型转换分为隐式类型转换和显式类型转换 隐式类型转换是由编译器完成的 开发者并未参与 所有又称强制类型转换 显式类型转换是由开发者指定的 就是一般意义上的类型转换 一 显式转换 一 as 1 原生类型之间的转换 Rust不提供原生
  • OpenSSL SSL_read: Connection was reset, errno 10054

    一 问题描述 提交代码到github上 git报错如下 OpenSSL SSL read Connection was reset errno 10054 看报错提示 极大的可能是由于网络不稳定 连接超时导致的 如果多次尝试重新提交后 仍然
  • 解决:Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.1问题

    解决 Cannot resolve plugin org apache maven plugins maven compiler plugin 3 1问题 问题 Cannot resolve plugin org apache maven
  • 拳王虚拟项目公社:0基础小白副业年赚30W玩法大揭秘!看懂一半至少年赚10W!

    今天 我们分享一个励志的案例 一位工程师兼职创业 每天不超过3个小时 副业年收入30W 这个案例对我的触动和启发也非常大 我们主要分享 1 一类规模庞大的群体和一个小众冷门领域 他切下的蛋糕有多大 2 战术上的勤奋永远赚不了大钱 怎样的战略
  • C语言生成20个随机二位整数求奇偶个数并且从小到大输出

    这道题考察的是生成随机二位整数保存是要保存在一个容量为20的数组中 然后再循环进行判断奇偶性进行求个数和求和最终输出奇数平均值和偶数的和 最后采用冒泡排序对这个数组进行排序 冒泡排序可以看我之前的文章最终输出就行了 代码如下 include
  • 用MSYS2安装mingw

    文章目录 前言 卸载mingw 安装MSYS2 前言 安装MSYS2的原因是 在windows安装protobuf时 想用mingw编译protobuf的库 而protobuf的官方手册只给出一句 To build from source
  • IDEA常用快捷键

    Intellij IDEA常用快捷键 Ctrl E 显示最近修改的文件列表 Ctrl Shift Backspace Ctrl alt 左右方向键 跳转到上次编辑的地方 Ctrl F12 可以显示当前文件的结构 Ctrl Shift Ins
  • 【ICKIM 2022】第四届知识与信息管理国际会议

    2022 知识与信息管理国际会议 ICKIM 2022 第四届国际知识与信息管理会议 作为WSSE的研讨会 将于2022年9月28日至30日在厦门举行 一 会议出版 会议被接收的文章将出版到ACM 会议论文集 ISBN 978 1 4503
  • mybatis中的options注解

    mybatis的 Options注解能够设置缓存时间 能够为对象生成自增的key 场景 一个表id 主键 设置为自增 而当我们需要在dao层插入数据的时候立刻获取到该自动生成的id 实现 如下 Insert insert into inst
  • 内存检测工具Dr.Memory在Windows上的使用

    之前在https blog csdn net fengbingchun article details 51626705 中介绍过Dr Memory 那时在Windows上还不支持x64 最新的版本对x64已有了支持 这里再总结下 Dr M
  • 抽象工厂方法

    在工厂方法中 我们可以很方便的创建一个产品继承结构下的多个产品 那么考虑这么一种情况 我们需要在工厂中创建多个不同继承结构的产品 例如皮肤库 包含按钮 文本框 选择框等多个不同的元素 Spring皮肤库包含了一组相似的按钮 文本框 选择框