You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
## 介绍
抽象工厂和工厂模式主要意图是为了解决多接口选择问题。抽象工厂是在此基础上作为一个中心工厂并创建其他的工厂的模式。
抽象工厂可以理解为通过代理创建不同的工厂
+ 抽象工厂模式, 所要解决的问题就是在一个产品族, 存在多个不同类型的产品( redis集群、操作系统) 情况下, 接口选择的问题。而这种场景在业务开发中很常见
+ 你的代码只是被ifelse埋上了! 当你知道什么场景下何时可以被抽象工程优化代码, 那么你的代码层级结构可以很好的实现功能并提升扩展度
## 代码例子
当系统中有多个redis集群时, 需要对集群进行切换。并且各个redis的方法名不一致, 此时就需要使用模式进行处理
![[Snipaste_2023-02-12_13-04-15.png]]
通过实现ICacheAdapter接口将不同集群的调用方法统一。另外JDKProxy、JDKInvocationHandler是代理类的定义和实现, 这也是抽象工厂的另一种实现方式。这样的可以很好的把原有操作redis的方法进行代理操作, 并通过控制传参实现集群切换。
![[Snipaste_2023-02-12_13-04-43.png]]
![[Snipaste_2023-02-12_13-07-36.png]]
![[Snipaste_2023-02-12_13-08-02.png]]
这里实际上是通过CacheService的同名方法对cacheAdapter中的同名方法进行调用
![[Snipaste_2023-02-12_13-10-02.png]]
重点说下Proxy.newProxyInstance方法
三个参数:
loader: 一个ClassLoader对象, 定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces: 一个Interface对象的数组, 表示的是我将要给我需要代理的对象提供一组什么接口, 如果我提供了一组接口给它, 那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
h: 一个InvocationHandler对象, 表示的是当我这个动态代理对象在调用方法的时候, 会关联到哪一个InvocationHandler对象上
这里实际上调用的是handler中的同名方法
![[Snipaste_2023-02-12_13-10-32.png]]
可以稍微修改下, 这样就不需要实现CacheService了
![[Snipaste_2023-02-12_14-46-59.png]]
测试
![[Snipaste_2023-02-12_13-11-00.png]]