简单工厂、工厂方法、抽象工厂、Builder 模式 笔记整理

软设-设计模式 抽象工厂是工厂模式的升级,工厂模式的确是可以通过多个工厂来生产不同的东西,但是它每个工厂只能生产一种商品。例如海尔电视机工厂只能生产电视机,不能生产其他的,所以就出现了抽象工厂,抽象工厂就是定义了个抽象的工厂,这个抽象工厂能够生产不同商品,然后器具体实现工厂来实现它这些产品,例如有个抽象工厂能够生产电视机和洗衣机,然后有个海尔工厂继承这个抽象工厂,它可以生产海尔电视机和海尔洗衣机,这就实现了一个工厂生产多种产品。 阅读详情
1、简单工厂模式

首先,需要表明的是,简单工厂模式并不是 23 种设计模式之一。它是工厂方法模式的一个弱化版本。

且简单工厂模式又称为静态工厂模式。

在该模式中,一般不定义工厂抽象类,而是直接将工厂类的工厂方法改为静态方法(因此才有静态工厂模式的说法)。

静态的工厂方法可以根据参数的不同返回不同类的实例。

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

适用场景

工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

优点

通过使用工厂类,外界不再需要关心如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有功能(方法)。
构造容易,逻辑简单。

缺点
  1. 简单工厂模式中的 if else 判断非常多,完全是 Hard Code,如果有一个新产品要加进来,就要同时添加一个新产品类,并且必须修改工厂类,再加入一个 else if 分支才可以, 这样就违背了 “开放-关闭原则”中的对修改关闭的准则了。当系统中的具体产品类不断增多时候,就要不断的修改工厂类,对系统的维护和扩展不利。
  2. 一个工厂类中集合了所有的类的实例创建逻辑,违反了高内聚的责任分配原则,将全部的创建逻辑都集中到了一个工厂类当中,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。因此一般只在很简单的情况下应用,比如当工厂类负责创建的对象比较少时。
  3. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
2、工厂方法模式

工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

即某个具体的产品类由对应的工厂子类生产。

适用场景
  1. 一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
  2. 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
  3. 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
优点
  1. 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。

  2. 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。

  3. 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”,这点比简单工厂模式更优秀。

缺点
  1. 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

  2. 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到 DOM、反射等技术,增加了系统的实现难度。

3、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为 Kit 模式(Kit: 套件)。

适用场景
  1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。

  2. 系统中有多于一个的产品族,而每次只使用其中某一产品族。与工厂方法模式的区别

  3. 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。

  4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

如创建主题框架,定义工厂接口,亮色主题工厂生产对应的亮色的 Button、TextView,暗色主题也生产对应的控件。

优点
  1. 分离了接口与实现,客户端不用关心实现,只是面向产品的接口编程,实现了高内聚低耦合的设计目的。

  2. 增加新的具体工厂和产品族很方便,因为一个具体的工厂实现代表的是一个产品族,无须修改已有系统,符合 “开闭原则”。(注意,这里是说产品族,而不是产品类,比如上面的主题框架,要增加一个粉色主题的,则增加对应的工厂,实现产品族的生产方法即可)

缺点
  1. 类文件的爆炸性增加

  2. 不太容易扩展新的产品类,增加新的产品类就要修改抽象工厂(即工厂接口,定义新的产品类的创建方法),那么所有的具体的工厂类均会被修改。(还是上面的主题框架,假设要新增一个产品类,即新增一个控件类,则需要先修改工厂接口,定义新的控件生产方法,然后修改其子类,实现定义的方法)

4、Builder 模式

将一个复杂对象的构建与它的表示分离,是同样的构建过程可以创建不同的表示。

说的通俗一点,就是构建的时候,使用同样的参数构建方法,但是传入的内容不同,就会得到不同的配置的表现。比如 AlterDialog,可能根据不同的需求会有不同 title、content 等,因此在构建的时候设置不同的参数,在表示的时候就会又对应的不同的内容。

适用场景

初始化一个对象特别复杂,如参数多,且很多参数都具有默认值的情况。

优点
  1. 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节;
  2. 建造者独立,容易扩展;
  3. 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到;
  4. 能够屏蔽对象参数设置的细节,使用者只需要按照对外提供的方法来传入参数即可,也能提高参数的设置的灵活度(如不必要按照顺序往构造方法传入参数等)。还可以达到限制使用者行为的作用,因为限定了参数设置的方法。
缺点
  1. 会产生多余的 Builder 对象以及 Director 对象(用于封装构建过程,并不是必须的),消耗内存;
  2. 对象的构建过程暴露。
5. 四者的不同

简单工厂模式:一个工厂方法创建不同类型的对象。

工厂方法模式:一个具体的工厂类负责创建一个具体的对象类型。

抽象工厂模式:一个具体的工厂类负责创建一系列相关的对象。

Builder 模式:对象的构建与表示分离,更注重对象的创建过程。

构建者模式是将构建与表示分离,而工厂模式是隐藏对象的实例过程,统一对外提供创建的实例。

参考文章

1、https://lrh1993.gitbooks.io/android_interview_guide/content/design-mode/Builder-Pattern.html
2、《Android 源码设计模式解析与实战》(第 2 版)

掌握 Flutter 中的工厂模式:实用指南 让我们首先创建一个基Product类,它将有一个显示产品详细信息的方法。 阅读详情

相关推荐

Multisim实战:5分钟搞定一阶RC电路仿真(附示波器波形分析技巧)

本文通过Multisim软件,详细演示了如何快速搭建一阶RC电路并进行仿真分析。文章提供了从元件选取、电路连接、虚拟示波器设置到波形观测的完整流程,并重点分享了测量时间常数、区分电路响应类型等核心分析技巧,帮助电子工程初学者和爱好者高效掌握电路仿真与分析方法。

weixin_29175469的博客 182

抽象工厂模式和builder模式

抽象工厂模式作为工厂模式的一种,自然具有工厂模式的设计理念,也就是提供一种生产实际产品的方法。 builder模式的设计思想是提供一种组装产品零件的方法。 二者乍看起来井水不犯河水,可仔细一看二者何其相似来耳。 在抽象工厂方法中有产品族的概念,意指同一系列的产品。比如魔兽中的一个族就有一套这样的单位,而不同族之间都含有类似的单位,而各自对应的单位又具有一些差异。这样在抽象工厂方法中建立4...

weixin_30701521的博客 103

NVIDIA DGX Spark (Ubuntu 24.04) 部署Isaac Sim与Isaac Lab:二进制安装与ROS2集成实战

本文详细介绍了在NVIDIA DGX Spark工作站(Ubuntu 24.04系统)上,通过预编译二进制包稳定部署Isaac Sim与Isaac Lab的完整实战流程。文章重点剖析了二进制安装相较于源码编译和pip安装的优势,有效规避了CUDA、PyTorch等关键组件的版本冲突陷阱,并逐步指导完成环境配置、Isaac Lab集成、Conda环境管理以及ROS2 Jazzy的集成,最终构建出完整的机器人仿真与强化学习开发平台。

kite3的博客 396

【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )

一、 命名构造方法 二、 工厂构造方法 三、 命名工厂构造方法 四、 相关资源

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3286

maxwell 平面变压器仿真(一)

在学习开关电源设计的时候,我们难免要设计变压器,采用有限元仿真软件MAXWELL 可以帮助我们确定变压器的励磁电感,漏感等参数。对于我们的理论分析大有裨益。但是苦于这破软件的教程真的是相当的零散,我相信大家用起来也总是苦于没有系统的教程指导,撰写本文的目的有两个,一个是记录自己使用的一些问题,一个是给大家提供一个可以参考的文档。

qq_45405656的博客 8243

STM32 SAI接口TDM模式实战:8通道音频采集系统搭建全流程(附DMA配置代码)

本文详细介绍了基于STM32 SAI接口TDM模式搭建8通道音频采集系统的全流程。内容涵盖硬件连接设计、CubeMX时钟树与SAI外设的详细配置,并重点解析了TDM模式的核心代码实现与DMA双缓冲机制,提供了完整的配置代码和常见时序问题排查指南,助力开发者高效实现多通道音频传输与处理。

weixin_29192211的博客 503

flutter 单例实现与factory

以前一直是复制粘贴,如今有点时间了,开始回头思考一些理所当然的代码,说实话,单例用了很久了,但是依然不知道为啥这么用,今天好好总结下,好摆脱只会复制粘贴的小白。工厂方法构造函数:如果一个构造函数不总是返回一个新对象,则用foctory来定义这个构造函数。例如一个工厂构造函数,可能从缓存中获取一个实例并返回,或者返回一个子类型的实例。使用单例本身目的在于创建一个唯一的对象,避免该对象可能会出现多头使用,造成数据冲突,还一个好处-----减少内存消耗。...

tianya1800的博客 2468

管理类联考——逻辑——真题篇——按知识分类——综合推理

29、某部门抽检了肉制品、白酒、乳制品、干果、蔬菜、水产品、饮料等﹖类商品共521种样品,发现其中合格样品515种,不合格样品6种。已知: (1)蔬菜、白酒中有2种不合格样品。 (2)肉制品、白酒、蔬菜、水产品中有5种不合格样品。 (3)蔬菜、乳制品、干果中有3种不合格样品。 根据上述信息,可以得出以下哪项? A. 乳制品中没有不合格样品。 B. 肉制品中没有不合格样品。 C. 蔬菜中没有不合格样品。 D. 白酒中没有不合格样品。 E. 水产品中没有不合格样品。 31~32题基于以下题干: 某中学举行田径运

stqer的博客 2013

【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

一、工厂方法模式简介、 二、工厂方法模式适用场景、 三、工厂方法模式优缺点、 四、工厂方法模式代码示例、 1、产品抽象类、 2、产品实现类 1、 3、产品实现类 2、 4、抽象工厂类、 5、实现工厂类 1、 6、实现工厂类 2、 7、测试类、 五、扩展上述工厂方法模式、 1、扩展的产品实现类、 2、扩展的工厂实现类、 3、测试类、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6761

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

「汽车电子助手」的博客 1万+

【同等学力】2005-数学⭐✨

有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5

super_mochi1 305

Java工厂模式深度解析:从简单工厂到抽象工厂的实战应用

在软件工程中,设计模式是解决常见问题的可复用方案,其中创建型模式专注于对象实例化过程。工厂模式作为核心创建型模式,其原理是通过封装对象创建逻辑,将对象的构造与使用分离,从而降低代码耦合度。这一技术价值在于提升系统的可维护性和扩展性,尤其在需要根据运行时条件动态创建对象、管理复杂对象生命周期或确保产品族一致性的场景中作用显著。例如,在支付系统、UI主题库或数据库访问层等实际应用中,工厂模式能有效应对需求变更。本文聚焦Java工厂模式的三种形态——简单工厂、工厂方法和抽象工厂,通过支付系统等具体案例,深入剖析其

weixin_33970449的博客 382

【乐鑫】唤醒词修改方法

乐鑫科技的语音识别模块(如ESP-SR)支持自定义唤醒词,但需通过官方工具链完成。

以实战经验介绍行业知识 823

创建模式之工厂、工厂方法、抽象工厂与建造者(builder)

ref:http://redsnow-fenglin.iteye.com/blog/691868 由于博文仅倾向于模式的理解与相似模式间关系,所以,博文可能会以某类模式一起论述的形式出现。这些主要是个人回顾性的总结,具有较强的随意性,必定存在论述上的不周或过于累赘,还望朋友们海涵指正。       我们知道设计模式的最基本的原则是状态变化部分和不变部分尽可能地分离,比如桥接(Bridg

Evan's learning log 1874

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式(一) - 建造者模式、单例模式、工厂模式

本文系统介绍了三种常见设计模式:单例、工厂和建造者模式。单例模式保证全局唯一实例,分为饿汉式(类加载创建)和懒汉式(延迟加载+DCL双重检查锁),枚举单例是线程安全的最佳实践。工厂模式封装对象创建,包含简单工厂(if-else判断)、工厂方法(每个产品对应工厂)和抽象工厂(生产产品族)。建造者模式适用于复杂对象的分步构建,通过链式调用提高可读性,常用于多字段实体类创建。三种模式核心区别:单例控制实例数量,工厂直接提供完整对象,建造者关注组装过程。文章详细分析了各种实现方式的优缺点、适用场景及线程安全问题,并

weixin_45839019的博客 281

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

23种设计模式笔记整理

设计模式 创建型模式 将对象的部分创建工作延迟到子 类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。   工厂方法(factory method) 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使得一个类的实例化延迟(目的:解耦, 手段:虚函数)到子类。   抽象工厂(abstract factory) 提供一个接口,让该接口负责创建一系列“相关或者相互依 赖的对象”,无需指定它们具体的类。 如果没有应对“多系列对象构建”的

PBomb的博客 445

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【笔记整理】图解设计模式 | 第7章 Builder模式(组装复杂的实例)

【笔记整理】图解设计模式 | 导航 定义 组装具有复杂结构的实例。 Builder模式中的登场角色 Builder(建造者) ConcreteBuilder(具体的建造者) Director(监工),只调用在Builder角色中被定义的方法,不依赖于ConcreteBuilder角色如何实现。 Builder模式的类图 Builder模式的时序图 拓展思路的要点 谁知道...

351

工厂模式实战:从支付网关看创建逻辑解耦与运行时装配

工厂模式是一种面向对象的创建型设计模式,核心在于将对象实例化过程与业务使用逻辑分离,从而提升系统的可维护性、可扩展性与可测试性。其本质不是替代new操作,而是通过封装创建逻辑实现多态创建、配置驱动和运行时装配。在电商支付、IoT设备接入、SaaS多租户等复杂场景中,简单工厂适用于变体少的轻量需求,工厂方法支持上下文感知的策略切换,抽象工厂则保障多组件间的一致性约束。结合依赖注入、YAML配置驱动与自动注册机制,工厂模式可演进为支撑热插拔、灰度发布与环境隔离的现代架构基础设施。

baochuanying9531的博客 421

Java设计模式中建造者模式是啥/建造者模式实现细节是什么/工厂模式,抽象工厂与建造者模式之间区别是啥

Java设计模式中建造者模式是啥/建造者模式实现细节是什么/工厂模式,抽象工厂与建造者模式之间区别是啥

花花的小脑瓜的博客 657

[设计模式整理笔记 五] 创建者模式(Builder)

[导读] [设计模式整理笔记 一] 基础知识 [设计模式整理笔记 二] 简单工厂模式(Simple Factory) [设计模式整理笔记 三] 工厂模式(Factory) [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory) [设计模式整理笔记 五] 创建者模式(Builder) [设计模式整理笔记 六] 工厂模式与创建者模式总结 [设计模式整理笔记 七] 原型...

weixin_33943836的博客 94

DESIGN PATTERNS学习笔记

*相关模式及比较  1.创建型模式 ABSTRACT FACTROY(抽象工厂)抽象工厂主要应用于系统有多个产品且系统与其产品之间存在独立性时。抽象工厂可以一次性地创建一个系列中的多个产品,且这些产品可以在一起使用。任何一个产品系列事实上只需要一个工厂就可生产,因此工厂可以被设计为单件。对外界观察者,抽象工厂提供了一个统一的接口,外界不需要知道它的具体实现是怎样的。对每一个产品系列都要实现一个具体

lovelulin的专栏 1111

二十三种设计模式4 建造者模式(Builder)

1.概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。   建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成...

servepeople的博客 159

gpio的8种工作模式_23种设计模式知识点详细解析(含PDF学习资料)

前言:Java 中一般认为有 23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。虽然不需要全会,当然能掌握的越多越好。总体来说设计模式分为三大类:创建型模式共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式共11种:策略模式、...

weixin_39653361的博客 177

步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)

园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层。 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招胜有招,其实设计模式中也有这种总纲,那便是 ?Identify the aspects of your application that vary and separate them from wh...

weixin_33971977的博客 160
上一篇: View 工作原理笔记整理
下一篇: 关于 Android APK 签名的文章备忘
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值