## 介绍 抽象工厂和工厂模式主要意图是为了解决多接口选择问题。抽象工厂是在此基础上作为一个中心工厂并创建其他的工厂的模式。 抽象工厂可以理解为通过代理创建不同的工厂 + 抽象工厂模式,所要解决的问题就是在一个产品族,存在多个不同类型的产品(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]]