美文网首页
ByteBufAllocator: 抽象工厂模式

ByteBufAllocator: 抽象工厂模式

作者: OisCircle | 来源:发表于2018-08-24 19:56 被阅读0次

抽象工厂

抽象工厂结构图

ByteBufAllocator结构层次

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(), 实现层与接口行为被抽象层屏蔽了, 只负责实现以上两个最基本的方法, 不需要考虑接口之间的行为

相关文章

网友评论

      本文标题:ByteBufAllocator: 抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/ztduiftx.html