type
status
date
slug
summary
tags
category
icon
password
AI summary

一、定义

notion image
抽象工厂模式,类似于动态代理对象的生成工厂,集中管理各个代理对象,使用代理对象解决实际业务场景,减少代码的依赖
抽象⼯⼚模式与⼯⼚⽅法模式虽然主要意图都是为了解决,接⼝选择问题。但在实现上,抽象⼯⼚是⼀个中⼼⼯⼚,创建其他⼯⼚的模式

二、示例:

模拟场景: 很多时候初期业务的蛮荒发展,也会牵动着研发对系统的建设。 预估 QPS较低 、 系统压⼒较⼩ 、 并发访问不⼤ 、 近⼀年没有⼤动作 等等,在考虑时间投⼊成本的前提前,并不会投⼊特别多的⼈⼒去构建⾮常完善的系统。就像对 Redis 的使⽤,往往可能只要是单机的就可以满⾜现状。
但随着业务超过预期的快速发展,系统的负载能⼒也要随着跟上。原有的单机 Redis 已经满⾜不了系 统需求。这时候就需要更换为更为健壮的Redis集群服务,虽然需要修改但是不能影响⽬前系统的运 ⾏,还要平滑过渡过去。
随着这次的升级,可以预⻅的问题会有;
  1. 很多服务⽤到了Redis需要⼀起升级到集群。
  1. 需要兼容集群A和集群B,便于后续的灾备。
  1. 两套集群提供的接⼝和⽅法各有差异需要做适配
  1. 不能影响到⽬前正常运⾏的系统。

传统硬编码方式(都在一个类里面实现,多重if else嵌套使用)

定义集群接口:CacheClusterService
集群接口实现:CacheClusterImpl,随着集群类型变多,if else判断也变多,需要修改以前的代码,违背了开闭原则
测试:ApiTest

抽象工厂模式

定义缓存实现接口:ICacheAdapter
EGMCache缓存实现接口:EGMCacheAdapter
IIRCache缓存实现接口:IIRCacheAdapter
JDK动态代理:JDKInvocationHandler
JDK动态代理的实现工厂:JDKProxyFactory
测试:ApiTest

UML关系图

未使用抽象工厂模式 每新增一个实现,需要重新进行if else判断,修改之前的代码逻辑
notion image
抽象工厂模式:都共同实现接口
,以便于jdk动态代理对象获取每个代理对象
notion image
总结: 这个设计模式满⾜了;
等优点,但如果说随着业务的不断拓展,可能会造成类实现上的复杂度。但也可以说算不上缺点,因为可以随着其他设计⽅式的引⼊和代理类以及⾃动⽣成加载的⽅式降低此项缺点。
JAVA【设计模式】单例模式JAVA【设计模式】策略模式