设计模式(Design pattern)的官方定义是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。解决的是代码可重用、代码更容易被他人理解、保证代码可靠性的问题。

Hadoop作为一个06年开始开源走到现在的框架,已经是一个非常成熟和经典的系统了。这个里面对于设计模式的使用也是非常的经典,本篇主要介绍一下Hadoop中使用到的设计模式,非常值得学习。额外需要提到的是这里的设计模式特指:四人帮23种模式.

关于设计模式的详细介绍可见:http://www.runoob.com/design-pattern/design-pattern-tutorial.html

1.创建型模式

1.1 单例模式 单例模式(Singleton Pattern)

RMPolicyProvider : 双重锁的形式单例实现。

NMPolicyProvider,HDFSPolicyProvider : 饿汉式的单例实现。

一般是要求全局单例的要求。

1.2 建造者模式(Builder Pattern)

BalancerParameters.Builder : hadoop中的建造者都作为内部类来实现

同样的还有DatanodeProtocolProtos.Builder 在hadoop中都是协议构造的内部,因为每次请求都是新建一个协议请求,是多例场景的经典

1.3 工厂模式(Factory Pattern)

ContextFactory:简单工厂的实现,同时这个类还实用了享元模式来提升性能

1.4 抽象工厂模式(Abstract Factory Pattern)

KeyProvider,KeyProviderFactory: 组合实现了抽象工厂。多维度的变化

1.5 原型模式(Prototype Pattern)

JobStatus : 就是原型的实现,可复制

ContextFactory :这个中居然也使用了原型,其中的cloneContext方法

2.结构型模式

2.1 适配器模式(Adapter Pattern)

LevelDBMapAdapter,SdkTokenProviderAdapter: 适配其他接口

2.2 桥接模式(Bridge Pattern)

暂时还没发现

2.3 过滤器模式(Filter、Criteria Pattern)

CopyFilter,RegexCopyFilter:勉强算是过滤器模式应用,不算非常典型,例如J2EE中的Filter,FilterChain

ResourceHandler,ResourceHandlerChain :这个算是。ResourceHandlerChain

2.4 组合模式(Composite Pattern)

CompositeService:很典型的组合模式

2.5 装饰器模式(Decorator Pattern)

暂时没找到

2.6 外观模式(Facade Pattern)

ResourceManager : 勉强算是门面模式,封装了所有的资源的操作

2.7 享元模式(Flyweight Pattern)

RMContextImpl,ApplicationACLsManager:都比较勉强算是吧。

CompressionCodecFactory : 缓存了各种压缩编码,准确的就是享元模式。

2.8 代理模式(Proxy Pattern)

ClientServiceDelegate:代理了客户端服务,代理的原因是要做一些安全检查,状态记录

3. 行为模式

3.1 责任链模式(Chain of Responsibility Pattern)

暂时没发现

3.2 命令模式(Command Pattern)

ResourceHandler,ResourceHandlerChain :这个算是。

3.3 解释器模式(Interpreter Pattern)

暂时没发现

3.4 迭代器模式(Iterator Pattern)

BatchedRemoteIterator :有next,hasNext方法,很明显的标志

3.5 中介者模式(Mediator Pattern)

暂时没发现

3.6 备忘录模式(Memento Pattern)

暂时没发现

3.7 观察者模式(Observer Pattern)

ServiceListeners

3.8 状态模式(State Pattern)

StateMachine,InternalStateMachine:hadoop内部作业的状态流转 。

3.9 空对象模式(Null Object Pattern)

随处可见的使用

NullRMStateStore,NullApplicationHistoryStore,NullOutputFormat等等

3.10 策略模式(Strategy Pattern)

RMStateStore,LeveldbRMStateStore,ZKRMStateStore:都是策略,数不胜数

3.11 模板模式(Template Pattern)

ContainerExecutor : 抽象了一些方法由子类来实现

3.12 访问者模式(Visitor Pattern)

FileDistributionVisitor,ImageVisitor

如果对于设计非常熟悉的话,你会发现 hadoop的代码一点都不难读懂。整体结构非常的清晰和简单,是一个写的非常好的框架,比我看到的Hive的源码质量高很多。