抽象工厂
![](https://img.haomeiwen.com/i13078107/940043961abb63fe.png)
ByteBufAllocator
结构层次
![](https://img.haomeiwen.com/i13078107/5c59cab83815a574.png)
ByteBufAllocator
接口层
提供了一系列给用户调用的接口, 包括生成各种ByteBuf
:ioBuffer()
heapBuffer()
directBuffer()
compositeBuffer()
...
并且提供了一个默认工厂ByteBufAllocator DEFAULT = ByteBufUtil.DEFAULT_ALLOCATOR;
在ByteBufUtil
工具类里定义了一个默认工厂, 默认工厂的具体类型需要由具体实现的子类确定.
默认情况下, 根据当前应用所在的平台, 判断需要使用池化工厂还是非池化工厂
ByteBufUtil里面的默认工厂
PreferHeapByteBufAllocator
实现类
由名字便可以猜测用途, 该实现类直接实现接口, 被标记为不稳定类, 存在争议性, 这里不做研究
AbstractByteBufAllocator
抽象层
抽象层实现了接口层
这是对工厂实现的一层抽象, 设计巧妙.
首先抽象层实现了内存泄漏检测功能, 默认的监测等级是SIMPLE
, 方法 protected static ByteBuf toLeakAwareBuffer(ByteBuf buf){ ... }
降低ByteBuf
内存泄漏监测等级. 其次, 抽象层定义了如下新的抽象方法
protected abstract ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity);
protected abstract ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity);
注意是protected
修饰的, 所以只有子类能访问到, 封装性需要
这两个抽象方法支撑了直接内存和堆内存buffer的实现, 为什么是支撑? 如果你去读源码, 会发现接口之间是逐层调用逐层支撑的, 最终都会调用到这两个抽象方法
所以实现层只需要具体实现抽象层定义的抽象方法,不需要实现所有方法, 抽象层抽象了逻辑调用.
抽象层是用来被继承并实现抽象方法的, 具体实现类只与抽象层打交道
UnPooledByteBufAllocator
实现类
以下是实现类的声明
![]()
可见UnPooledByteBufAllocator
工厂不但用来生产非池化的buffer, 还需要实现ByteBuf
度量功能, 实时监测内存情况
PooledByteBufAllocator
实现类
和
UnPooledByteBufAllocator
工厂一样,PooledByteBufAllocator
不但用来生产非池化的buffer, 还需要实现ByteBuf度量功能, 实时监测内存情况
![]()
上述两个实现类都实现了抽象层定义的两个抽象方法, 并且实现了各自的度量功能. 池化工厂的实现比非池化工厂复杂, 需要与Netty自己的内存池打交道, 涉及到内存池的创建和回收释放等问题
总结
Netty在此设计的抽象工厂模式, 各个层次分工明确.
- 接口层只提供接口, 定义只与用户行为相关的接口: 生产
buffer
, 提供默认工厂(缺省实现) - 抽象层定义抽象行为, 将相互依赖的接口之间的行为抽象出来, 并提供抽象方法来细化, 支持这些接口行为, 减轻实现层的负担
- 实现层继承自抽象层, 只需要实现抽象层提供的方法
newDirectBuffer()
和newHeapBuffer()
, 实现层与接口行为被抽象层屏蔽了, 只负责实现以上两个最基本的方法, 不需要考虑接口之间的行为
网友评论