第3章 创建型模式实训.docx
《第3章 创建型模式实训.docx》由会员分享,可在线阅读,更多相关《第3章 创建型模式实训.docx(18页珍藏版)》请在冰豆网上搜索。
![第3章 创建型模式实训.docx](https://file1.bdocx.com/fileroot1/2023-1/23/f19c9ad7-8de3-40a1-b292-678f6d4747eb/f19c9ad7-8de3-40a1-b292-678f6d4747eb1.gif)
第3章创建型模式实训
第3章创建型模式实训
3.3实训练习
3.3.2填空题
1.某系统提供一个简单计算器,具有简单的加法和减法功能,系统可以根据用户的选择实例化相应的操作类。
现使用简单工厂模式设计该系统,类图如图1所示:
图1类图
在图1中,Operation是抽象类,其中定义了抽象方法getResult(),其子类AddOperation用于实现加法操作,SubOperation用于实现减法操作,Calculator是简单工厂类,工厂方法为createOperation(),该方法接收一个char类型的字符参数,如果传入的参数为“+”,工厂方法返回一个AddOperation类型的对象,如果传入的参数为“-”,则返回一个SubOperation类型的对象。
【Java代码】
abstractclassOperation
{
protectedintnumberA;
protectedintnumberB;
//numberA和numberB的Setter方法和Getter方法省略
public
(1)intgetResult();
}
classAddOperationextendsOperation
{
publicintgetResult()
{
returnnumberA+numberB;
}
}
classSubOperationextendsOperation
{
publicintgetResult()
{
returnnumberA-numberB;
}
}
classCalculator
{
public
(2)createOperation(charoperator)
{
Operationop=null;
(3)
{
case'+':
op=(4);
break;
case'-':
op=(5);
break;
}
(6);
}
}
classTest
{
publicstaticvoidmain(Stringargs[])
{
intresult;
Operationop1=Calculator.createOperation('+');
op1.setNumberA(20);
op1.setNumberB(10);
result=(7);
System.out.println(result);
}
}
2.某软件公司欲开发一个数据格式转换工具,可以将不同数据源如txt文件、数据库、Excel表格中的数据转换成XML格式。
为了让系统具有更好的扩展性,在未来支持新类型的数据源,开发人员使用工厂方法模式设计该转换工具的核心类。
在工厂类中封装了具体转换类的初始化和创建过程,客户端只需使用工厂类即可获得具体的转换类对象,再调用其相应方法实现数据转换操作。
其类图如图1所示:
图1类图
在图1中,ConvertorCreator是抽象工厂接口,它声明了工厂方法getConvertor(),在其子类中实现该方法,用于创建具体的转换对象;Convertor是抽象产品接口,它声明了抽象数据转换方法transform(),在其子类中实现该方法,用于完成具体的数据转换操作。
类DBConvertor和TXTConvertor分别用于将数据库中的数据和txt文件中的数据转换为XML格式。
【Java代码】
interfaceConvertorCreator
{
(1);
}
interfaceConvertor
{
publicStringtransform();
}
classDBConvertorCreatorimplementsConvertorCreator
{
publicConvertorgetConvertor()
{
(2);
}
}
classTXTConvertorCreatorimplementsConvertorCreator
{
publicConvertorgetConvertor()
{
(3);
}
}
classDBConvertorimplementsConvertor
{
publicStringtransform()
{
//实现代码省略
}
}
classTXTConvertorimplementsConvertor
{
publicStringtransform()
{
//实现代码省略
}
}
classTest
{
publicstaticvoidmain(Stringargs[])
{
ConvertorCreatorcreator;
(4);
creator=newDBConvertorCreator();
convertor=(5);
convertor.transform();
}
}
如果需要针对一种新的数据源进行数据转换,该系统至少需要增加(6)个类。
工厂方法模式体现了以下哪些面向对象设计原则?
(7)。
(多选)
A.开闭原则B.依赖倒转原则C.接口隔离原则D.单一职责原则E.合成复用原则
3.某手机游戏软件公司欲推出一款新的游戏软件,该软件能够支持Symbian、Android和WindowsMobile等多个主流的手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制类和游戏界面控制类,并提供相应的工厂类来封装这些类的初始化。
软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,采用抽象工厂模式进行设计所得类图如图1所示:
图1类图
在该设计方案中,具体工厂类如SymbianFactory用于创建Symbian操作系统平台下的游戏操作控制类SymbianOperationController和游戏界面控制类SymbianInterfaceController,再通过它们的业务方法来实现对游戏软件的初始化和运行控制。
【Java代码】
interfaceAbstractFactory
{
publicOperationControllergetOperationController();
publicInterfaceControllergetInterfaceController();
}
interfaceOperationController
{
publicvoidinit();
//其他方法声明省略
}
interfaceInterfaceController
{
publicvoidinit();
//其他方法声明省略
}
classSymbianFactoryimplementsAbstractFactory
{
publicOperationControllergetOperationController()
{
(1);
}
publicInterfaceControllergetInterfaceController()
{
(2);
}
}
classAndroidFactory(3)
{
publicOperationControllergetOperationController()
{
returnnewAndroidOperationController();
}
publicInterfaceControllergetInterfaceController()
{
returnnewAndroidInterfaceController();
}
}
classSymbianOperationController(4)
{
publicvoidinit(){
//实现代码省略
}
//其他方法声明省略
}
classAndroidOperationController(5)
{
publicvoidinit(){
//实现代码省略
}
//其他方法声明省略
}
classSymbianInterfaceControllerimplementsInterfaceController
{
publicvoidinit(){
//实现代码省略
}
//其他方法声明省略
}
classAndroidInterfaceControllerimplementsInterfaceController
{
publicvoidinit(){
//实现代码省略
}
//其他方法声明省略
}
classTest
{
publicstaticvoidmain(Stringargs[])
{
AbstractFactoryaf;
(6)oc;
(7)ic;
af=newSymbianFactory();
oc=(8);
ic=(9);
oc.init();
ic.init();
}
}
如何需要在上述设计方案中增加对WindowsMobile操作系统的支持,需对该设计方案进行哪些调整,简单说明实现过程。
4.某软件公司欲开发一个音频和视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。
在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。
现使用建造者模式设计该软件,所得类图如图1所示:
图1类图
在该设计方案中,MainScreen是播放器的主界面,它是一个复合对象,包括菜单、播放列表、主窗口和控制条等成员。
ModeBuilder是一个抽象类,定义了一组抽象方法buildXXX()用于逐步构造一个完整的MainScreen对象,getScreen()是工厂方法,用于返回一个构造好的MainScreen对象。
ScreenModeController充当指挥者,用于指导复合对象的创建,其中construct()方法封装了具体创建流程,并向客户类返回完整的产品对象。
【Java代码】
classMainScreen
{
publicStringmenu;
publicStringplayList;
publicStringmainWindow;
publicStringcontrolBar;
}
(1)classModeBuilder
{
protectedMainScreenscreen=newMainScreen();
publicabstractvoidbuildMenu();
publicabstractvoidbuildPlayList();
publicabstractvoidbuildMainWindow();
publicabstractvoidbuildControlBar();
publicMainScreengetScreen()
{
(2);}
}
classFullModeBuilderextendsModeBuilder
{
publicvoidbuildMenu(){//实现代码省略}
publicvoidbuildPlayList(){//实现代码省略}
publicvoidbuildMainWindow(){//实现代码省略}
publicvoidbuildControlBar(){//实现代码省略}
}
classSimpleModeBuilderextendsModeBuilder
{
publicvoidbuildMenu(){//实现代码省略}
publicvoidbuildPlayList(){//实现代码省略}
publicvoidbuildMainWindow(){//实现代码省略}
publicvoidbuildControlBar(){//实现代码省略}
}
classScreenModeController
{
privateModeBuildermb;
publicvoidsetModeBuilder((3))
{
this.mb=mb;
}
publicMainScreenconstruct()
{
MainScreenms;
mb.buildMenu();
mb.buildPlayList();
mb.buildMainWindow();
mb.buildControlBar();
ms=(4);
returnms;
}
}
classTest
{
publicstaticvoidmain(Stringargs[])
{
ScreenModeControllersmc=(5);
ModeBuildermb;
mb=newFullModeBuilder();//构造完整模式界面
MainScreenscreen;
smc.setModeBuilder((6));
screen=(7);
System.out.println(screen.menu);
//其他代码省略
}
}
5.某数据处理软件需要增加一个图表复制功能,在图表对象中包含一个数据集对象,用于封装待显示的数据,可以通过界面的“复制”按钮将该图表复制一份,复制后可以得到新的图表对象,用户可以修改新图表的编号、颜色和数据。
现使用原型模式设计该软件,所得类图如图1所示:
图1类图
在该设计方案中,DataChart类包含一个DataSet对象,在复制DataChart对象的同时将复制DataSet对象,因此需要使用深克隆技术,可使用流来实现深克隆。
【Java代码】
importjava.io.*;
classDataSetimplementsSerializable
{//具体实现代码省略}
classColorimplementsSerializable
{//具体实现代码省略}
classDataChartimplementsSerializable
{
privateDataSetds=newDataSet();
privateColorcolor=newColor();
privateintno;
//成员属性的Getter方法和Setter方法省略
publicvoiddisplay(){
//具体实现代码省略
}
//使用流实现深克隆,复制容器的同时复制成员
public
(1)deepClone()throwsIOException,ClassNotFoundException,OptionalDataException
{
//将对象写入流中
ByteArrayOutputStreambao=newByteArrayOutputStream();
ObjectOutputStreamoos=new
(2);
oos.writeObject((3));
//将对象从流中取出
ByteArrayInputStreambis=newByteArrayInputStream(bao.toByteArray());
ObjectInputStreamois=new(4);
return((5));
}
}
classTest
{
publicstaticvoidmain(Stringargs[])
{
DataChartchart1,chart2=null;
chart1=newDataChart();
try{
chart2=(DataChart)chart1.deepClone();
}
catch(Exceptione){
e.printStackTrace();
}
System.out.println(chart1==chart2);
System.out.println(chart1.getDs()==chart2.getDs());
System.out.println(chart1.getNo()==chart2.getNo());
}
}
编译并运行上述代码,输出结果为:
(6)、(7)、(8)。
在本实例中,DataChart类和DataSet类需要实现Serializable接口的原因是(9)。
6.为了避免监控数据显示不一致并节省系统资源,在某监控系统的设计方案中提供了一个主控中心类,该主控中心类使用单例模式进行设计,类图如图1所示:
图1类图
在图1中,主控中心类MainControllerCenter是单例类,它包含一系列成员对象并可以初始化、显示和销毁成员对象,对应的方法分别为 init()、load()和destroy(),此外还提供了静态工厂方法getInstance()用于创建MainControllerCenter类型的单例对象。
【Java代码】
classMainControllerCenter
{
privateMenumenu;//主控中心菜单
privateToolBartb;//主控中心工具栏
privateMainFormmf;//主控中心主窗口
private
(1)MainControllerCentermcc;
(2)MainControllerCenter{
}
publicvoidinit()
{
menu=newMenu();
tb=newToolBar();
mf=newMainForm();
}
publicvoidload()
{
menu.display();
tb.display();
mf.display();
}
publicvoiddestroy()
{
menu.destroy();
tb.destroy();
mf.destroy();
}
publicstaticMainControllerCentergetInstance()
{
if(mcc==null)
{
(3);
}
returnmcc;
}
}
classTest
{
publicstaticvoidmain(Stringargs[])
{
MainControllerCentermcc1,mcc2;
mcc1=MainControllerCenter.getInstance();
mcc2=MainControllerCenter.getInstance();
System.out.println(mcc1==mcc2);
}
}
//其他代码省略
编译并运行上述代码,输出结果为(4)。
在本实例中,使用了(5)(填写懒汉式或饿汉式)单例模式,其主要优点是(6),主要缺点是(7)。
3.3.3综合题
1.使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象,用Java语言实现该场景。
现需要增加一个新的Robot类,如果传入参数“R”,则返回一个Robot对象,对代码进行修改并注意“女娲”的变化。
2.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。
图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。
使用工厂方法模式实现该程序的设计。
3.计算机包含内存(RAM)、CPU等硬件设备,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现计算机设备创建过程并绘制相应的类图。
4.电脑组装工厂可以将CPU、内存、硬盘、主机、显示器等硬件设备组装在一起构成一台完整的电脑,且构成的电脑可以是笔记本,也可以是台式机,还可以是不提供显示器的服务器主机。
对于用户而言,无须关心电脑的组成设备和组装过程,工厂返回给用户的是完整的电脑对象。
使用建造者模式实现电脑组装过程,要求绘制类图并编程实现。
5.设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。
绘制类图并编程实现。
6.使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,如两个或三个,设计并编写代码实现一个多例类。