侧边栏壁纸
博主头像
杨不易呀

你的压力来源于无法自律,只是假装努力,现状跟不上内心欲望,所以你焦虑又恐慌。——杨不易呀

  • 累计撰写 45 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

从零玩转设计模式之抽象工厂设计模式

杨不易呀
2022-12-08 / 0 评论 / 1 点赞 / 91 阅读 / 1,180 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-12-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

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

需满足条件

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

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

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

AbstractFactory:抽象工厂,定义创建一组相关或依赖对象的接口。
ConcreteFactory:具体工厂,实现抽象工厂定义的接口,并创建一组具体产品。
AbstractProduct:抽象产品,定义一类产品的接口。
ConcreteProduct:具体产品,实现抽象产品定义的接口,每一个具体产品都是一个完整的对象。
Client:客户端,使用抽象工厂和抽象产品的接口来创建一组相关或依赖对象。

产品族

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

image-1670486670108

需求

假设现在引入一种新的产品
按照工厂方法模式的写法,自然就要在具体的苹果工厂类里再增加一个新的方法,返回新的苹果实例
同时也要增加新的苹果这个新的产品
其他水果工厂类是一样的做法
这明显违背了 OCP(开闭) 原则
苹果工厂类既能生成进口苹果也能生产国产苹果,违背了单一职责原则
那么我们需要苹果工厂只能生产国产的水果如果需要生产其他的那么就重新创建一个工厂即可

代码实现

抽象产品接口实现

image-1670489310846

抽象产品实现

image-1670489688789

抽象工厂和具体工厂实现

image-1670488428563

运行

image-1670490109660

UML图解析

image-1670490188460

结构

image-1670490201013

依赖关系

image-1670490470521

角色

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

抽象工厂模式的优缺点

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

使用场景

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

源码分析

JDK Connection源码

image-1670490565274

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

Mybatis SqlSessionFactory源码

总结

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

评论区