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