Hadoop序列化中的工厂设计模式_第1页
Hadoop序列化中的工厂设计模式_第2页
Hadoop序列化中的工厂设计模式_第3页
Hadoop序列化中的工厂设计模式_第4页
Hadoop序列化中的工厂设计模式_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hadoop 序列化中的工厂设计模式最近学习Hadoop技术内幕,简单研究了部分Hadoop源码。综合以前了解的一些开源项目,发现高端代码乍一看上去有一个共同特性:到处都是泛型,到处都是反射。直接打开一个方法的定义,基本找不到它的实现逻辑,只能找到接口。后来结合书上的介绍稍作了解,出现这种现象,说明源码很多都用到了抽象工厂模式。故再次查阅了抽象工厂的定义。相信这对于今后开发中定义一个优秀的架构是很有帮助的。抛出问题:Hadoop的序列化在Hadoop中有序列化的概念。简单搞清楚序列化:1, 序列化是什么?就是把对象转化成二进制的流。反序列化就是把二进制流转化成对象。2, 为什么要序列化?三点:

2、持久化格式用于存储;通信数据格式用于传输;对象深拷贝;Hadoop中主要用前两点。3, 为什么不用Java内建的序列化?Java序列化非常强大。序列化的时候把什么类描述,各种版本号,父类的信息都写到流中。一个简单的类能写出一大推数据来,对于强烈需要减少传输量提高效率的分布式计算就不适应。故Hadoop自己搞了一套。搞清楚了序列化的概念,然后再说一下有哪些东西需要序列化:Java中不是有个Serializable接口吗?同样:在hadoop中有Writable接口,实现Writable的类都是要序列化的类。简单举例几个:IntWritable,LongWritable,Text。在java中就是

3、int,Long,String,只是在hadoop要适应新的序列化给改了。好了,那么Hadoop既然是java写的,不可能原来的序列化完全抛开不用了吧,所以原来的实现Serializable的也要序列化然后,序列化系列操作肯定有两个方法是相互依赖不可分割的:序列化和反序列化。那么总结一下:操作有两种:序列化和反序列化操作对象分两类:实现了Serializable的对象和实现了Writable的对象工厂系列的模式是干什么的?工厂类的模式,说穿了:调用一个工厂的工厂方法,可以产生诸多相互关联的对象。程序员灵活的选择创建哪个对象,这样就避免的在程序中反复创建各种对象,使创建对象和业务解耦,增加了程序

4、的可扩展性。工厂系列模式的简单总结工厂系列的模式有:1, 简单工厂;2, 工厂方法;3, 抽象工厂;应该说:越往下,越抽象,越解耦。简单总结下各工厂的实现,重点说hadoop中抽象工厂。为了使文档完整,对于1、2,我简单得列举了几个网上的例子,自己加了一点说明,没仔细分析,需有需要可再次上网搜索。简单工厂有三个元素:1, 工厂类角色:具体类实现,用于判断要创建哪个产品对象2, 抽象产品角色:一个抽象类或接口,为一系列相关产品的父类3, 具体产品角色:一个或多个实现或继承抽象产品的具有共性的类简单例子:/抽象产品角色 public interface Car public void drive(

5、); /具体产品角色 public class Benz implements Car public void drive() System.out.println(Driving Benz ); public class Bmw implements Car public void drive() System.out.println(Driving Bmw ); /工厂类角色 public class Driver /工厂方法 /注意 返回类型为抽象产品角色 public static Car driverCar(String s)throws Exception /判断逻辑,返回具体的产

6、品角色给Client if(s.equalsIgnoreCase(Benz) return new Benz(); else if(s.equalsIgnoreCase(Bmw) return new Bmw(); . else throw new Exception(); . /欢迎暴发户出场. public class Magnate public static void main(String args) try /告诉司机我今天坐奔驰 Car car = Driver.driverCar(benz); /下命令:开车 car.drive(); . 这个例子我从网上抓下来的,先搞清楚什么

7、是简单工厂模式,这里,他的缺点很明显:虽然业务与对象创建解耦了,但是具体工厂里涉及到了一部分业务,万一这部分判断比较复杂,这不仅写起来复杂麻烦,可扩展性还非常差,不实用工厂方法模式有四个元素:抽象产品和具体产品和简单工厂模式是一样,把原有的具体工厂元素改为抽象工厂和具体工厂。/抽象产品角色 public interface Car public void drive(); /具体产品角色 public class Benz implements Car public void drive() System.out.println(Driving Benz ); public class Bmw

8、 implements Car public void drive() System.out.println(Driving Bmw ); /抽象工厂角色 public interface Driver public Car driverCar(); public class BenzDriver implements Driver public Car driverCar() return new Benz(); public class BmwDriver implements Driver public Car driverCar() return new Bmw(); /应该和具体产品

9、形成对应关系. /有请暴发户先生 public class Magnate public static void main(String args) try Driver driver = new BenzDriver(); Car car = driver.driverCar(); car.drive(); . 这个例子比开始那个结构要清晰一点了,可扩展性也好了一些,特定工厂生产特定产品,业务选择工厂来创建想要的产品。而且具体工厂类可随时增删,非常方便。抽象工厂方法上述两种模式我认为只能应付简单的场景,因为都是处理一维的情况,就是车分很多品牌。一个二层的树结构就能搞定他们的关系,假设出现二维

10、的复杂度,情况又不一样了这种产品是一个树形的结构,当然实在不行也可以把它当做一维树处理,毕竟是四种车嘛。但我们注意到:Benz和Bmw都分别有Buessiness和Sports的分类,可以说Buessiness的车相互相关,而Sports的车又相互相关,这里就有一种更好的处理这种情况的模式:抽象工厂模式。抽象工厂模式把一堆共性的产品称为产品族,比如Benz系列的车是一个产品族,Bmw系列的是一个产品族,而同是做Buessiness的是一个等级的,同是做Sports的是一个等级的。看一个草图: 网上的说明把等级和产品族搞反了。这里一个抽象工厂是处理一个等级上的产品,最后,网上找不到最后一种模式怎

11、么写,我把它补充进来:我们假设上述例子中的主人公去买车,他需要进行比较。首先抽象工厂处理的就是一个等级里的不同产品族的产品,那么就是开宝马和开奔驰/抽象工厂public interface DriveFactory public Car driveBenz(); public Car driveBmw();/具体工厂public class BuessinessDriveFactory implements DriveFactory public Car driveBenz () return new BenzforBuessiness (); public Car driveBmw () r

12、eturn new BmwforBuessiness (); public class SportsDriveFactory implements DriveFactory public Car driveBenz () return new BenzforSports (); public Car driveBmw () return new BmwforSports (); 抽象产品应该根据不同的产品族来进行区分/抽象产品public interface Benzpublic interface Bmw public void compareWith(Benz bCar);public c

13、lass BenzforBuessiness implements Benzpublic class Benzfor Buessiness implements Benz public void compareWith(Benz bCar); System.out.println(this.class.getSimpleName + “is larger than” + bCar.getSimpleName);public class BmwforSports implements Bmwpublic class BmwforSports implements Bmw public void

14、compareWith(Bmw bCar); System.out.println(this.class.getSimpleName + “is faster than” + bCar.getSimpleName);最后搞一个功能性类class ChooseCar private Benz benzCar; private Benz bmwCar; public chooseCar(DriveFactory factory) benzCar = factory. driveBenz();bmwCar = factory. driveBmw();public void compare() bmw

15、Car. compareWith(benzCar);应用工厂模式就不写了Hadoop中如何使用抽象工厂模式这里花了大量的篇幅来描述工厂系列的模式,现在开始正题,hadoop中是如何用抽象工厂模式还解决序列化的问题的。序列化里面的产品就是对对象进行序列化,这里也这么划分。目前一共有四种产品两个产品族位于同一个等级的不同产品是相互依赖的,抽象工厂就负责生产这两种同等级的产品,参照上面的描述,抽象产品应该如下:抽象产品就是执行序列化和反序列化的对象:public interface Serializer /为输出(序列化)对象做准备void open(InputStream in) throws I

16、OException;/将对象序列化到底层的流中T serialize(T t) throws IOException;void close() throws IOException;public interface Deserializer /为输出(序列化)对象做准备void open(InputStream in) throws IOException;/从底层的流中读取并给t赋值T deserialize(T t) throws IOException;void close() throws IOException;针对抽象产品的抽象工厂如下:public interface Seri

17、alization boolean accept(Class c);/这个用来判断序列化是否支持该对象Serializer getSerializer(Class c);/具体的序列化逻辑交给具体的产品类来完成,这里只负责生产产品 Deserializer getDeserializer(Class c);这里我们用到了泛型,因为java内建序列化要处理的是一批类,这些类都实现了一个共同的接口Serializable,而Hadoop序列化处理的都是实现了Writable接口的类,那么这个业务逻辑就是一个三维的对象了。如下图所示:到具体工厂的实现时,我们就会进一步指明泛型T。在具体工厂中,也应该

18、进一步说明执行序列化功能类定义,下面是具体工厂类public class JavaSerialization implements Serializationstatic class JavaSerializationDeserializer implements Deserializer /具体产品,执行序列化的类,怎么实现的太长就不贴了public boolean accept(Class c) return Serializable.class.isAssignableFrom(c);public Deserializer getDeserializer(Class c) return

19、new JavaSerializationDeserializer();public Serializer getSerializer(Class c) return new JavaSerializationSerializer();public class WritableSerialization extends Configured implements Serialization static class WritableDeserializer extends Configured implements Deserializer /具体产品,执行序列化的类public boolea

20、n accept(Class c) return Writable.class.isAssignableFrom(c);public Deserializer getDeserializer(Class c) return new WritableDeserializer(getConf(), c);public Serializer getSerializer(Class c) return new WritableSerializer();这里我们注意到,Java里面用了,而Hadoop里直接用了,究其原因,是因为Serializable接口里面压根没有方法,而Writable里是有方法可

21、以直接调用的。Hadoop中的工厂类和产品类就已经创建好了。那么还需要创建一个应用类,相当于API,相当于前面提到的ChooseCarpublic class SerializationFactory extends Configured private ListSerialization serializations = new ArrayListSerialization(); /队列的增删改不贴了 public Serializer getSerializer(Class c) return getSerialization(c).getSerializer(c); public Deserializer getDeserializer(Class c) return getSerialization(c)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论