您的位置:首页 > 编程语言 > Java开发

读书笔记_java设计模式深入研究 第三章 工厂模式 Factory

2014-12-18 17:40 716 查看
1,简单工厂

-1,定制抽象接口。

-2,定制具体子类。

-3,定制工厂类,通过工厂类的静态方法返回不同的子类对象。

packagepattern.chp02.facroty;
/**
*类描述:汽车接口
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201410:50:10AMJingCreated.
*
*/
publicinterfaceICar{
}
[/code]

/**
*类描述:高档汽车
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201410:52:06AMJingCreated.
*
*/
publicclassTopCarimplementsICar{
}
[/code]

/**
*类描述:中档汽车
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201410:52:56AMJingCreated.
*
*/
publicclassMidCarimplementsICar{
}
[/code]

packagepattern.chp02.facroty;
/**
*类描述:抵挡汽车
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201410:53:25AMJingCreated.
*
*/
publicclassLowCarimplementsICar{
}
[/code]

/**
*
*@(#)CarSimpleFactory.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:汽车工厂类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201410:54:16AMJingCreated.
*
*/
publicclassCarSimpleFactory{
/**
*
*方法说明:根据传入的汽车类型,返回不同的对象
*
*Author:JingCreateDate:Dec18,201411:19:05AM
*
*@paramcarType
*@return
*@returnICar
*/
publicstaticICarcreateCar(CarTypecarType){
ICarobj=null;
if(carType==CarType.TOP_CAR){
obj=newTopCar();
}elseif(carType==CarType.MID_CAR){
obj=newMidCar();
}elseif(carType==CarType.LOW_CAR){
obj=newLowCar();
}
returnobj;
}
}
[/code]

/**
*
*@(#)CarType.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:汽车类型
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201411:14:34AMJingCreated.
*
*/
publicenumCarType{
/**
*高档汽车
*/
TOP_CAR,
/**
*中档汽车
*/
MID_CAR,
/**
*抵挡汽车
*/
LOW_CAR;
}
[/code]

/**
*
*@(#)CarTest.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,201411:29:07AMJingCreated.
*
*/
publicclassCarTest{
publicstaticvoidmain(String[]args){
ICarobj=CarSimpleFactory.createCar(CarType.LOW_CAR);
System.out.println(obj);//
pattern.chp02.facroty.LowCar@19821f

}
}
[/code]

2,工厂模式

-1,定义抽象接口。

-2,定义产品子类。

-3,定义抽象工厂类。

-4,实现不同产品类对应的具体工厂类。

工厂方法更加的易于软件的维护和开发,相比于简单工厂方式,不需要每次修改工厂类的方法,每次只需要增加新的产品类和产品类的工厂类即可。

packagepattern.chp02.facroty;
/**
*类描述:抽象工厂接口
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20142:27:41PMJingCreated.
*
*/
publicabstractclassAbstractFactory{
/**
*
*方法说明:创建ICar对象
*
*Author:Jing
*CreateDate:Dec18,20142:28:12PM
*
*@return
*@returnICar
*/
publicabstractICarcreate();
}
[/code]

packagepattern.chp02.facroty;
/**
*类描述:高档汽车工厂类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20142:36:38PMJingCreated.
*
*/
publicclassTopFactoryextendsAbstractFactory{
@Override
publicICarcreate(){
returnnewTopCar();
}
}
[/code]

publicclassCarTest{
publicstaticvoidmain(String[]args){
ICarobj=CarSimpleFactory.createCar(CarType.LOW_CAR);
System.out.println(obj);
AbstractFactoryfactory=newTopFactory();
ICarcar=factory.create();
System.out.println(car);//pattern.chp02.facroty.TopCar@9304b1
}
}
[/code]

3,抽象工厂

-1,抽象工厂用来一个工厂生产多种类型的汽车。

/**
*
*@(#)IBus.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:公共汽车
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:05:10PMJingCreated.
*
*/
publicinterfaceIBus{
}
[/code]

/**
*
*@(#)UpBus.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:高级公共汽车
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:05:46PMJingCreated.
*
*/
publicclassUpBusimplementsIBus{
}
[/code]

/**
*
*@(#)MidBus.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:中档公共汽车
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:17:48PMJingCreated.
*
*/
publicclassMidBusimplementsIBus{
}
[/code]

/**
*
*@(#)AbstractFactory.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:抽象工厂接口
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20142:27:41PMJingCreated.
*
*/
publicabstractclassAbstractFactory{
/**
*
*方法说明:创建ICar对象
*
*Author:Jing
*CreateDate:Dec18,20142:28:12PM
*
*@return
*@returnICar
*/
publicabstractICarcreate();
/**
*
*方法说明:创建公共汽车IBus对象
*
*Author:Jing
*CreateDate:Dec18,20143:18:58PM
*
*@return
*@returnIBus
*/
publicabstractIBuscreateBus();
}
[/code]

/**
*
*@(#)TopFactory.java
*@Packagepattern.chp02.facroty
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty;
/**
*类描述:高档汽车工厂类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20142:36:38PMJingCreated.
*
*/
publicclassTopFactoryextendsAbstractFactory{
@Override
publicICarcreate(){
returnnewTopCar();
}
@Override
publicIBuscreateBus(){
returnnewUpBus();
}
}
[/code]

4,具体应用:

编写读文件功能。读取文件,包括编码(GBK,UTF-8,UNIONCODE)的文本文件,要求获取文本内容。读取图像文件(BMP,GIF,JPG),要求获取图像宽度、高度、长度、以及每一点的RGB基色信息。

-1,首先我们可以写出一个基本的工厂类模式,如下所示,生成对应的读取总接口,以及对应的文本和图像抽象类,及对应的子列,对应子类的工厂方法,实现要求,部分代码如下:

/**
*
*@(#)IRead.java
*@Packagepattern.chp02.facroty.file
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.file;
/**
*类描述:读取文件接口类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:27:54PMJingCreated.
*
*/
publicinterfaceIRead{
/**
*
*方法说明:根据文件名称读取文件
*
*Author:Jing
*CreateDate:Dec18,20143:28:25PM
*
*@paramfileName
*@returnvoid
*/
publicvoidread(StringfileName);
}
[/code]

/**
*
*@(#)AbstractImgRead.java
*@Packagepattern.chp02.facroty.file
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.file;
/**
*类描述:图像读取抽象类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:32:14PMJingCreated.
*
*/
publicabstractclassAbstractImgReadimplementsIRead{
publicabstractvoidread(StringfileName);
}
[/code]

/**
*
*@(#)AbstractTextRead.java
*@Packagepattern.chp02.facroty.file
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.file;
/**
*类描述:获取文本文件的抽象类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:29:14PMJingCreated.
*
*/
publicabstractclassAbstractTextReadimplementsIRead{
publicabstractvoidread(StringfileName);
}
[/code]

/**
*
*@(#)BMPImgRead.java
*@Packagepattern.chp02.facroty.file
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.file;
/**
*类描述:BMP图片读取
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:35:57PMJingCreated.
*
*/
publicclassBMPImgReadextendsAbstractImgRead{
@Override
publicvoidread(StringfileName){
//TODOAuto-generatedmethodstub
}
}
[/code]

/**
*
*@(#)AbstractFactory.java
*@Packagepattern.chp02.facroty.file
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.file;
/**
*类描述:工厂类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:49:15PMJingCreated.
*
*/
publicabstractclassAbstractFactory{
/**
*
*方法说明:创建对应的文件读取实例
*
*Author:Jing
*CreateDate:Dec18,20143:49:46PM
*
*@return
*@returnIRead
*/
publicabstractIReadcreate();
}
[/code]

/**
*
*@(#)GBKTextFactory.java
*@Packagepattern.chp02.facroty.file
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.file;
/**
*类描述:GBK文本读取工厂类
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20143:50:24PMJingCreated.
*
*/
publicclassGBKTextFactoryextendsAbstractFactory{
@Override
publicIReadcreate(){
returnnull;
}
}
[/code]

2,使用基于jdkAPI的方法实现文件读写,使用反射实现生成对应的类名。

/**
*
*@(#)IRead.java
*@Packagepattern.chp02.facroty.read
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.read;
/**
*类描述:读文本、图像文件接口
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20144:14:28PMJingCreated.
*
*/
publicinterfaceIRead<T>{
/**
*
*方法说明:根据传入的文件名读取文件
*
*Author:JingCreateDate:Dec18,20144:15:27PM
*
*@paramin
*@return
*@returnT
*/
Tread(String...in);
}
[/code]

/**
*
*@(#)ImageRead.java
*@Packagepattern.chp02.facroty.read
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.read;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;
/**
*类描述:图像文件读取
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20145:16:26PMJingCreated.
*
*/
publicclassImageReadimplementsIRead<ImageInfo>{
publicImageInforead(String...in){
BufferedImagebi=null;
Filef=newFile(in[0]);//in[0]存储文件名
try{
bi=ImageIO.read(f);
}catch(IOExceptione){
e.printStackTrace();
}
intwidth=bi.getWidth();
intheight=bi.getHeight();
intrgb[]=newint[width*height];
bi.getRGB(0,0,width,height,rgb,width,height);
ImageInfoinfo=newImageInfo();
info.setWidth(width);
info.setHeight(height);
info.setRGB(rgb);
returninfo;
}
}
[/code]

/**
*
*@(#)TextRead.java
*@Packagepattern.chp02.facroty.read
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.read;
importjava.io.File;
importjava.io.FileInputStream;
/**
*类描述:文本读取
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20144:17:19PMJingCreated.
*
*/
publicclassTextReadimplementsIRead<String>{
publicStringread(String...in){
Stringresult=null;
try{
Filefile=newFile(in[0]);
longlen=file.length();//文件长度
FileInputStreamfis=newFileInputStream(in[0]);//in[0]存储文件名称
bytebuf[]=newbyte[(int)len];
fis.read(buf);
result=newString(buf,in[1]);//in[1]存储编码方式
fis.close();
}catch(Exceptione){
System.out.println(e.getMessage());
}
returnresult;
}
}
[/code]

/**
*
*@(#)ImageInfo.java
*@Packagepattern.chp02.facroty.read
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.read;
/**
*类描述:图像信息
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20144:31:28PMJingCreated.
*
*/
publicclassImageInfo{
/**
*图像宽度
*/
privateintwidth;
/**
*图像高度
*/
privateintheight;
/**
*红色分量
*/
privateintr[][];
/**
*绿色分量
*/
privateintg[][];
/**
*颜色分量
*/
privateintb[][];
/**
*
*方法说明:设置三基色信息
*
*Author:JingCreateDate:Dec18,20144:33:51PM
*
*@paramrgb
*@returnvoid
*/
publicvoidsetRGB(intrgb[]){
r=newint[height][width];
g=newint[height][width];
b=newint[height][width];
intpos=0;
for(inti=0;i<height;i++){
pos=width*i;
for(intj=0;j<width;j++){
r[i][j]=(rgb[pos+j]&0xff0000)>>16;
g[i][j]=(rgb[pos+j]&0xff0000)>>8;
b[i][j]=(rgb[pos+j]&0xff0000);
}
}
}
/**
*@returnthewidth
*/
publicintgetWidth(){
returnwidth;
}
/**
*@paramwidth
*thewidthtoset
*/
publicvoidsetWidth(intwidth){
this.width=width;
}
/**
*@returntheheight
*/
publicintgetHeight(){
returnheight;
}
/**
*@paramheight
*theheighttoset
*/
publicvoidsetHeight(intheight){
this.height=height;
}
/**
*@returnther
*/
publicint[][]getR(){
returnr;
}
/**
*@paramr
*thertoset
*/
publicvoidsetR(int[][]r){
this.r=r;
}
/**
*@returntheg
*/
publicint[][]getG(){
returng;
}
/**
*@paramg
*thegtoset
*/
publicvoidsetG(int[][]g){
this.g=g;
}
/**
*@returntheb
*/
publicint[][]getB(){
returnb;
}
/**
*@paramb
*thebtoset
*/
publicvoidsetB(int[][]b){
this.b=b;
}
}
[/code]

/**
*
*@(#)AbstractFactory.java
*@Packagepattern.chp02.facroty.read
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.read;
/**
*类描述:抽象工厂
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20145:27:02PMJingCreated.
*
*/
publicabstractclassAbstractFactory{
/**
*
*方法说明:获取对应的读取对象
*
*Author:Jing
*CreateDate:Dec18,20145:30:08PM
*
*@return
*@returnIRead
*/
@SuppressWarnings("unchecked")
publicabstractIReadcreate();
/**
*
*方法说明:使用反射,根据掺入的类名生成对应的对象
*
*Author:Jing
*CreateDate:Dec18,20145:32:59PM
*
*@paramclassName
*@return
*@returnAbstractFactory
*/
staticAbstractFactorycreate(StringclassName){
AbstractFactoryfactory=null;
try{
Class<?>clazz=Class.forName(className);
factory=(AbstractFactory)clazz.newInstance();
}catch(Exceptione){
e.printStackTrace();
}
returnfactory;
}
}
[/code]

/**
*
*@(#)ImageFactory.java
*@Packagepattern.chp02.facroty.read
*
*Copyright©JINGCorporation.Allrightsreserved.
*
*/
packagepattern.chp02.facroty.read;
/**
*类描述:图像读取
*
*@author:Jing
*@version$Id:Exp$
*
*History:Dec18,20145:30:34PMJingCreated.
*
*/
publicclassImageFactoryextendsAbstractFactory{
@SuppressWarnings("unchecked")
@Override
publicIReadcreate(){
returnnewImageRead();
}
}
[/code]

简而言之,工厂模式是提供一种对象的创建方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: