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.

34 lines
2.2 KiB

This file contains ambiguous Unicode characters!

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]]