实验项目名称:抽象工厂模式(所属课程:软件设计模式)学院:计算机科学与信息工程学院专业班级:软件工程13-1姓名:王会芳学号:13031210130实验日期:2016年3月25实验地点:A06404合作者:指导教师:高原本实验项目成绩:教师签字:日期:一、实验目的与要求1.练习使用抽象模式。设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点。2.实验结束后,对相关内容进行总结。二、实验内容1.模式应用场景说明一个电子工厂可以生产各种类型的电子产品,如富士康可以生产手机、平板电脑、智能手表等,华硕生产手机、平板电脑、智能手表等,相同品牌的产品构成一个产品族,而相同类型的产品构成一个产品等级结构,现使用抽象工厂模式模拟该场景。2.应用场景类图通过分析,该实例类图如图1所示:图1电子工厂类图3.实现代码与解释1)抽象产品类Phone(手机类)publicinterfacePhone{publicvoidcall();}Phone是一种抽象产品类,它可以是一个接口,也可以是一个抽象类,其中包含业务方法call()。2)具体产品类FoxconPhone(富士康手机类)+producePhone():Phone+produceIpad():Ipad+EFactory+call():voidPhoneFoxconFactory+producePhone():Phone+produceIpad():IpadFoxconPhone+call():voidASUSIpad+playGame():voidASUSPhone+call():voidIpad+playGame():voidASUSFactory+producePhone():Phone+produceIpad():IpadFoxconIpad+playGame():voidpublicclassFoxconPhoneimplementsPhone{publicvoidcall(){System.out.println(富士康手机打电话中......);}}FoxconPhone是Phone的子类,实现了在Phone中定义的业务方法call()。3)具体产品类ASUSPhone(华硕手机类)publicclassASUSPhoneimplementsPhone{publicvoidcall(){System.out.println(华硕手机玩打电话中......);}}ASUSPhone是Phone的另一个子类,实现了在Phone中定义的业务方法call()。Phone、FoxconPhone和ASUSPhone构成了一个产品等级结构。4)抽象产品类IPad(平板电脑类)publicinterfaceIpad{publicvoidplayGame();}IPad是另一种抽象产品类,它可以是一个接口,也可以是一个抽象类,其中包含业务方法playGame()的声明。5)具体产品类FoxconIpad(富士康平板电脑类)publicclassFoxconIpadimplementsIpad{publicvoidplayGame(){System.out.println(富士康平板电脑玩游戏中......);}}FoxconIpad是Ipad的子类,实现了在IPad中定义的业务方法playGame()。6)具体产品类ASUSIpad(华硕平板电脑类)publicclassASUSIpadimplementsIpad{publicvoidplayGame(){System.out.println(华硕平板电脑玩游戏中......);}}ASUSIpad是Ipad的另一个子类,实现了在IPad中定义的业务方法playGame()。Ipad、FoxconIpad和ASUSIpad构成一个产品等级结构。7)抽象工厂类EFactory(电子工厂类)publicinterfaceEFactory{publicPhoneproducePhone();publicIpadproduceIpad();}EFactory类是抽象工厂类,其中定义了抽象工厂方法,针对每一个产品族的产品都提供了一个对应的工厂方法。8)具体工厂类FoxconFactory(富士康工厂类)publicclassFoxconFactoryimplementsEFactory{publicPhoneproducePhone(){returnnewFoxconPhone();}publicIpadproduceIpad(){returnnewFoxconIpad();}}FoxconFactory是EFactory的一个子类,实现了在EFactory中定义的工厂方法,用于创建具体产品对象。FoxconFactory所生产的具体产品构成了一个产品族。9)具体工厂类ASUSFactory(华硕工厂类)publicclassASUSFactoryimplementsEFactory{publicPhoneproducePhone(){returnnewASUSPhone();}publicIpadproduceIpad(){returnnewASUSIpad();}}ASUSFactory是EFactory的另一个子类,实现了在EFactory中定义的工厂方法,用于创建具体产品对象。ASUSFactory所生产的具体产品构成一个产品族。EFactory、ASUSFactory和FoxconFactory构成了一个工厂等级结构。10)配置config.xml本实例配置文件代码如下:?xmlversion=1.0?configclassNameFoxconFactory/className/config11)客户端测试类ClientpublicclassClient{publicstaticvoidmain(Stringargs[]){try{EFactoryfactory;Phonephone;Ipadipad;factory=(EFactory)XMLUtil.getBean();phone=factory.producePhone();phone.call();ipad=factory.produceIpad();ipad.playGame();}catch(Exceptione){System.out.println(e.getMessage());}}}4.结果及分析编译并运行程序,如果在配置文件config.xml中将className节点中的内容设置为:FoxconFactory,则输出结果如下:如果在配置文件中将className节点中的内容设置为:ASUSFactory,则输出结果如下:如果要增加一种新的品牌的产品,即增加一个新的产品族,如增加达丰的手机和仁宝的平板电脑,则需要对应增加一个具体工厂即可,再将配置文件中具体工厂类类名改为新增的工厂类类名,原有代码无须做任何修改。但是如果要增加一个新的产品,如增加一种新的电子产品智能手表,则原有类库代码需要做较大修改,在抽象工厂中需要声明一个生产智能手表的方法,所有的具体工厂类都需要实现该方法,将导致系统不再符合“开闭原则”。因此抽象工厂模式对于“开闭原则”的支持有其特殊性。三、实验总结1.通过本次实验对抽象工厂模式的动机和定义有了一定了解。2.通过本次实验掌握了抽象工厂模式结构。3.通过本次实验学会类如画抽象工厂模式结构图。