title: 从零玩转设计模式之抽象工厂设计模式
date: 2022-12-08 16:05:03.28
updated: 2022-12-11 23:03:16.842
url: https://www.yby6.com/archives/chouxiangshejimoshi
categories:
- 设计模式
tags:
- 设计模式

什么是抽象工厂设计模式?

抽象工厂模式是一种软件设计模式,它提供了一种方法来创建相关或依赖对象的家族,而不需要指定它们的具体类,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

需满足条件

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品
  • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

为了学习的目的我进行图片形式展现,各位同学请手动打出自己的设计模式代码

抽象工厂模式包含以下几个角色:

AbstractFactory:抽象工厂,定义创建一组相关或依赖对象的接口。

ConcreteFactory:具体工厂,实现抽象工厂定义的接口,并创建一组具体产品。

AbstractProduct:抽象产品,定义一类产品的接口。

ConcreteProduct:具体产品,实现抽象产品定义的接口,每一个具体产品都是一个完整的对象。

Client:客户端,使用抽象工厂和抽象产品的接口来创建一组相关或依赖对象。

产品族

所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。

需求

假设现在引入一种新的产品

按照工厂方法模式的写法,自然就要在具体的苹果工厂类里再增加一个新的方法,返回新的苹果实例

同时也要增加新的苹果这个新的产品

其他水果工厂类是一样的做法

这明显违背了 OCP(开闭) 原则

苹果工厂类既能生成进口苹果也能生产国产苹果,违背了单一职责原则

那么我们需要苹果工厂只能生产国产的水果如果需要生产其他的那么就重新创建一个工厂即可

代码实现

抽象产品接口实现

抽象产品实现

抽象工厂和具体工厂实现

运行

UML图解析

结构

依赖关系

角色

抽象工厂(Abstract Factory)
提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
具体工厂(Concrete Factory)
主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
抽象产品(Product)
定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品(ConcreteProduct)
实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

抽象工厂模式的优缺点

优点
分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。
也就是说,客户端从具体的产品实现中解耦
使切换产品族变得容易
因一个具体的工厂实现代表的是一个产品族,切换产品族只需要切换一下具体工厂
缺点
不太容易扩展新的产品,
如需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂(增加新的接口方法)
这样就会导致修改所有的工厂实现类

使用场景

  • 系统独立于产品的创建、组成以及表示。
  • 系统配置成具有多个产品的系列,例如 Microsoft Windows或Apple McIntosh类。
  • 相关产品对象系列是共同使用的,而且必须确保这一点。这是该模式的关键,否则可以使用Factory Method模式。
  • 你希望提供产品的类库,只开放其接口,而不是其实现。

源码分析

JDK Connection源码

Connection 是一个经典的抽象工厂,而 Statement、PreparedStatement、CallableStatement 是 Connection 这个抽象工厂中提供的三个抽象产品。

Mybatis SqlSessionFactory源码

总结

  • 不同条件下创建不同实例
  • 产品标准化,生产更高效
  • 目的 -> 封装创建细节

从零玩转设计模式之抽象工厂设计模式-chouxiangshejimoshi的更多相关文章

  1. iOS 设计模式之抽象工厂

    设计模式是程序提升的必备知识,这里说下iOS怎样实现抽象工厂设计模式.本文是看过oc编程之道这本的抽象工厂这章后写出的,假设不明确原理能够看看那本书. TestView.h首先创建一个视图 // // ...

  2. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  3. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  4. 使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)

    本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文 ...

  5. Java设计模式之抽象工厂

    概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  6. C#--抽象工厂设计模式原理

    C#--抽象工厂设计模式原理 C#--抽象工厂设计模式--三层框架 C#--使用反射改进简单工厂

  7. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  8. 用C# (.NET Core) 实现抽象工厂设计模式

    用C# (.NET Core) 实现抽象工厂设计模式   本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/ ...

  9. GoLang设计模式3 - 抽象工厂模式

    之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式.抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象. UML类图大致如下: 类图比较复杂 ...

  10. 设计模式之抽象工厂模式(附带类似反射功能的实现/c++)

    问题描述 假设我们要开发一款游戏, 当然为了吸引更多的人玩, 游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理).于是我们就可以采用这样一 ...

随机推荐

  1. PYQT5学习(12)Qtabwidget 选项卡及其窗口,Qstackedwidget和Qtabwidget的效果类似,以及系统托盘QsystemtrayIcon

    参考博文:https://blog.csdn.net/jia666666/article/details/81669092QTabWidget控件提供一个选项卡和一个页面区域,默认显示第一个选项卡的页 ...

  2. 「luogu - P3158」「cqoi 2011」放棋子

    link. 解读一下,大概就是一种颜色放进去就会占据一行一列,dp 状态就好想了:\(f_{i,j,k}\) 表示恰好用完前 \(k\) 种颜色的所有棋子,占据了 \(i\) 行 \(j\) 列的方案 ...

  3. Record - Nov. 20th, 2020 - Exam. SOL

    LOC 2020.11.20 - Prob. 1 Desc. & Link. \(C=2^{k}\bmod(a+b+c)\) #include <cstdio> typedef l ...

  4. Spring Boot RestController接口如何输出到终端

    背景 公司项目的批处理微服务,一般是在晚上固定时段通过定时任务执行,但为了预防执行失败,我们定义了对应的应急接口,必要时可以通过运维在终端中进行curl操作.然而,部分任务耗时较长,curl命令执行后 ...

  5. ActivityNotFoundException

    activity  加入 AndroidManifest android.content.ActivityNotFoundException: Unable to find explicit acti ...

  6. 一行代码搞定 font-size 响应式

    前言 公司要做大屏,但是大屏还要有个嵌在系统的版本,屏幕(iframe)小了但字体大了怎么办.网上找了很多代码都很长,个人参考了资料后实现了一个一行代码 font-size 响应式. TL;DR ht ...

  7. 征集 meme

    当你每次兴致勃勃地和好友分享自己喜欢的歌但 Ta 不屑一顾 / 不喜欢时:

  8. Chromium VIZ工作流

    在 Chromium 中 viz 的核心逻辑运行在 GPU 进程中,负责接收其他进程产生的 viz::CompositorFrame(简称 CF),然后把这些 CF 进行合成,并将合成的结果最终渲染在 ...

  9. 还在用图片表示三角形与箭头吗?不会用CSS来绘制你就OUT了!!!

    作者:WangMin 格言:努力做好自己喜欢的每一件事 你是否还在用图片制作三角形和剪头吗?那就太out了.css可以轻松绘制出你想要的三角形与箭头,而且颜色大小可以随意改变,还不用担心失真等问题.那 ...

  10. crazy

    说实话刚拿到题目我是一点思路没有,因为我感觉伪代码里面的函数名都太奇怪了,怀疑应该不是在这方面出题,结果看了wp发现就是在这方面出题... 这种情况我是从后面开始看的,看看出现正确提示会需要什么条件 ...