抽象工廠
ByteBufAllocator
結(jié)構(gòu)層次
ByteBufAllocator
接口層
提供了一系列給用戶調(diào)用的接口, 包括生成各種ByteBuf
:ioBuffer()
heapBuffer()
directBuffer()
compositeBuffer()
...
并且提供了一個默認(rèn)工廠ByteBufAllocator DEFAULT = ByteBufUtil.DEFAULT_ALLOCATOR;
在ByteBufUtil
工具類里定義了一個默認(rèn)工廠, 默認(rèn)工廠的具體類型需要由具體實現(xiàn)的子類確定.
默認(rèn)情況下, 根據(jù)當(dāng)前應(yīng)用所在的平臺, 判斷需要使用池化工廠還是非池化工廠
ByteBufUtil里面的默認(rèn)工廠
PreferHeapByteBufAllocator
實現(xiàn)類
由名字便可以猜測用途, 該實現(xiàn)類直接實現(xiàn)接口, 被標(biāo)記為不穩(wěn)定類, 存在爭議性, 這里不做研究
AbstractByteBufAllocator
抽象層
抽象層實現(xiàn)了接口層
這是對工廠實現(xiàn)的一層抽象, 設(shè)計巧妙.
首先抽象層實現(xiàn)了內(nèi)存泄漏檢測功能, 默認(rèn)的監(jiān)測等級是SIMPLE
, 方法 protected static ByteBuf toLeakAwareBuffer(ByteBuf buf){ ... }
降低ByteBuf
內(nèi)存泄漏監(jiān)測等級. 其次, 抽象層定義了如下新的抽象方法
protected abstract ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity);
protected abstract ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity);
注意是protected
修飾的, 所以只有子類能訪問到, 封裝性需要
這兩個抽象方法支撐了直接內(nèi)存和堆內(nèi)存buffer的實現(xiàn), 為什么是支撐? 如果你去讀源碼, 會發(fā)現(xiàn)接口之間是逐層調(diào)用逐層支撐的, 最終都會調(diào)用到這兩個抽象方法
所以實現(xiàn)層只需要具體實現(xiàn)抽象層定義的抽象方法,不需要實現(xiàn)所有方法, 抽象層抽象了邏輯調(diào)用.
抽象層是用來被繼承并實現(xiàn)抽象方法的, 具體實現(xiàn)類只與抽象層打交道
UnPooledByteBufAllocator
實現(xiàn)類
以下是實現(xiàn)類的聲明
可見UnPooledByteBufAllocator
工廠不但用來生產(chǎn)非池化的buffer, 還需要實現(xiàn)ByteBuf
度量功能, 實時監(jiān)測內(nèi)存情況
PooledByteBufAllocator
實現(xiàn)類
和
UnPooledByteBufAllocator
工廠一樣,PooledByteBufAllocator
不但用來生產(chǎn)非池化的buffer, 還需要實現(xiàn)ByteBuf度量功能, 實時監(jiān)測內(nèi)存情況
上述兩個實現(xiàn)類都實現(xiàn)了抽象層定義的兩個抽象方法, 并且實現(xiàn)了各自的度量功能. 池化工廠的實現(xiàn)比非池化工廠復(fù)雜, 需要與Netty自己的內(nèi)存池打交道, 涉及到內(nèi)存池的創(chuàng)建和回收釋放等問題
總結(jié)
Netty在此設(shè)計的抽象工廠模式, 各個層次分工明確.
- 接口層只提供接口, 定義只與用戶行為相關(guān)的接口: 生產(chǎn)
buffer
, 提供默認(rèn)工廠(缺省實現(xiàn)) - 抽象層定義抽象行為, 將相互依賴的接口之間的行為抽象出來, 并提供抽象方法來細(xì)化, 支持這些接口行為, 減輕實現(xiàn)層的負(fù)擔(dān)
- 實現(xiàn)層繼承自抽象層, 只需要實現(xiàn)抽象層提供的方法
newDirectBuffer()
和newHeapBuffer()
, 實現(xiàn)層與接口行為被抽象層屏蔽了, 只負(fù)責(zé)實現(xiàn)以上兩個最基本的方法, 不需要考慮接口之間的行為