设计模式(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的源码质量高很多。