Bootstrap

创建型设计模式典型设计题

1. (填空题)

某软件公司要开发一个数据格式转换工具,可以将不同数据源如txt文件、数据库、Excel表格中的数据转换成XML格式。为了让系统具有更好的可扩展性,在未来支持新类型的数据源,开发人员使用工厂方法模式设计该转换工具的核心类。在工厂类中封装了具体转换类的初始化和创建过程,客户端只须使用工厂类即可获得具体的转换类对象,再调用其相应方法实现数据转换操作。其类图如下所示:

在图中,ConvertorCreator是抽象工厂接口,它声明了工厂方法getConvertor(),在其子类中实现该方法,用于创建具体的转换对象;Convertor是抽象产品接口,它声明了抽象数据转换方法transform(),在其子类中实现该方法,用于完成具体的数据转换操作。类DBConvertor和TXTConvertor分别用于将数据库中的数据和TXT文件中的数据转换为XML格式。

 请完成以下Java代码中的填空及后面选择填空。

【Java代码】

interface ConvertorCreator {
               ;        
}
interface Convertor {
    public String transform();
}
class DBConvertorCreator implements ConvertorCreator{
    public Convertor getCovertor(){
                  ;    
    }
}
class TXTConvertorCreator implements ConvertorCreator{
    public Convertor getCovertor(){
                   ;     
    }
}
class DBConvertor implements Convertor{
    public String transform(){
        //实现代码省略
    }
}
class TXTConvertor implements Convertor{
    public String transform(){
        //实现代码省略
    }
}
class Test{
    public static void main(String[] args) {
        ConvertorCreator creator;
                   ;     
        creator = new DBConvertorCreator();
        convertor =            ;      
        convertor.transform();
    }    
}

如果需要针对一种新的数据源进行数据转换,该系统至少需要增加           个类。工厂方法模式体现了以下面向对象设计原则中的           (可以多选)。

A、开闭原则    B、依赖倒转原则    C、接口隔离原则      D、单一职现原则

E、合成复用原则

正确答案:

(1) public Convertor getConvertor()

(2) return new DBConvertor()

(3) return new TXTConvertor()

(4) Convertor convertor

(5) creator.getConvertor()

(6) 2

(7) ABD

2. (填空题)某系统提供一个简单计算器,具有简单的加法和减法功能,系统可以根据用户的选择实例化相应的操作类。现使用简单工厂模式设计该系统,类图如下所示:


在图中,Operation是抽象类,其中定义了抽象方法getResult(),其子类AddOperation  用于实现加法操作,SubOperation用于实现减法操作。Calculator是简单工厂类,工厂方法为crcateOperation(),该方法接收一个char类型的字符参数,如果传入的参数为“+”,工厂方法返回一个AddOperation类型的对象,如果传入的参数为“-”,则返回-个SubOpcration类型的对象。
请完成以下Java代码中的填空。
【Java代码】
abstract class Operation {
    protected int numberA;
    protected int numberB;
    //numberA和numberB的Setter方法和Getter方法省略
    public ____int getResult();  
}

class AddOperation extends Operation{
    public int getResult(){
        return numberA + numberB;
    }
}

class SubOperation extends Operation{
    public int getResult(){
        return numberA - numberB;
    }
}

class Calculator{
    public ____createOperation(char operator){  
        Operation op = null;
        ____{        
            case '+':
                op = ____;      
                break;
            case '-':
                op = ____;      
                break;
        }
        ____;      
    }
}

class Test{
    public static void main(String args[]){
        int result;
        Operation op1 = Calculator.createOperation('+');
        op1.setNumberA(20);
        op1.setNumberB(10);
        result = ____;      
        System.out.println(result);
    }
}

正确答案:

(1) abstract

(2) static Operation

(3) switch(operator)

(4) new AddOperation()

(5) new SubOperation()

(6) return op

(7) op1.getResult()

3. (填空题)为了避免监控数据显示不一致并节省系统资源,在某监控系统的设计方案中提供了一个主控中心类,该主控中心类使用单例模式进行设计,类图如下图所示:
请完成以下Java代码中(1)--(3)空的代码填写,以及执行后(4)--(7)空填写。


 在图中,主控中心类MainControllerCenter是单例类,它包含一系列成员对象并可以初始化、显示和销毁成员对象,对应的方法分别为init()、load()和destroy(),此外还提供了静态工厂方法getInstance()用于创建MainControllerCenter类型的单例对象。完成下列Java代码中的填空,以及后面的分析填空。
【Java代码】
class MainControllerCenter {
    private Menu menu;     //主控中心菜单
    private ToolBar tb;    //主控中心工具栏
    private MainForm mf;   //主控中心主窗口
    private ____MainControllerCenter mcc;    
    ____  MainControllerCenter{    
       
    }
    public void init(){
        menu = new Menu();
        tb = new ToolBar();
        mf = new MainForm();
    }    
    public void load(){
        menu.display();
        tb.display();
        mf.display();
    }
    public void destroy(){
        menu.destroy();
        tb.destroy();
        mf.destroy();
    }
    public static MainControllerCenter getInstance(){
        if(mcc == null){
            ____;    
        }
        return mcc;
    }
}
class Test{
    public static void main(String args[]){
        MainControllerCenter mcc1,mcc2;
        mcc1 = MainControllerCenter.getInstance();
        mcc2 = MainControllerCenter.getInstance();
        System.out.println(mcc1 == mcc2);
    }
}
//其他代码省略
编译并运行上述代码,输出结果为(____ )。
在本实例中,使用了(____ )(填写懒汉式或饿汉式)单例模式,其主要优点是(____ ),主要缺点是(____ )。

正确答案:

(1) static

(2) private

(3) mcc = new MainControllerCenter()

(4) true

(5) 懒汉式

(6) 使用的时候再实例化,可节约资源

(7) 必须处理好多线程访问问题,速度和反应时间相对“饿汉式”较慢

4. (填空题)某数据处理软件需要增加一个图表复制功能,在图表对象中包含一个数据集对象,用于封装待显示的数据,可以通过界面的“复制”按钮将该图表复制一份,复制后可以得到新的图表对象,用户可以修改新图表的编号、颜色和数据。现使用原型模式设计该软件,所得类图如下所示:
请完成以下Java代码中的代码填空,以及执行后的填空。
 


   在该设计方案中,DataChart类包含一个DataSet对象,在复制DataChart对象的同时将复制DataSet对象,因此需要使用深克隆技术,可以用流来实现深克隆。

【Java代码】
import java.io.*;
class DataSet implements Serializable{
    //具体实现代码省略
}
class Color implements Serializable{
    //具体实现代码省略
}
class DataChart implements Serializable{
    private DataChart ds = new DataChart();
    private Color color = new Color();
    private int no;
    //成员属性的Getter方法和Setter方法省略
    public void display(){
        //具体实现代码省略
    }
    //使用流实现深克隆,复制容器的同时复制成员
    public ____deepClone() throws IOException,ClassNotFoundException,OptionalDataException{  
        //将对象写入流中
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        ObjectOutputStream oos = new  ____;  
        oos.writeObject(____);    
        //将对象从流中取出
        ByteArrayInputStream bis = new ByteArrayOutputStream(bao.toByteArray());
        ObjectInputStream ois = new ____;    
        return(____);    
    }
}
class Test{
    public static void main(String[] args) {
        DataChart chart1,chart2 = null;
        chart1 = new DataChart();
        try{
            chart2 = (DataChart)chart1.deepClone();
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(chart1 == chart2);
        System.out.println(chart1.getDs() == chart2.getDs());
        System.out.println(chart1.getNo() == chart2.getNo());        
    }
}
编译并运行上述代码,输出结果为:(____)(____)(____)。
在本实例中,DataChart类和DataSet类需要实现Serializable接口的原因是(____)。

正确答案:

(1) Object

(2) ObjectOutputStream(bao)

(3) this

(4) ObjectInputStream(bis)

(5) ois.readObject()

(6) false

(7) false

(8) true

(9) 只有实现了Serializable接口类的对象才能写入流中

5. (填空题)某手机游戏软件公司要推出一款新的游戏软件,该软件能够Symbian、Android和Windows Mobile等多个主流的手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制类和游戏界面控制类,并提供相应的工厂类来封装这些类的初始化。软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,采用抽象工厂模式进行设计所得类图如下所示:
请完成以下Java代码中(1)--(9)空的代码填写。


   在该设计方案中,具体工厂类如SymbianFactory用于创建Symbian操作系统平台下的游戏操作控制类SymbianOperationController和游戏界面控制类SymbianInterfaceController,再通过它们的业务方法来实现对游戏软件的初始化和运行控制。完成如下Java代码中的填空及后面的分析填空。
【Java代码】
interface AbstractFactory{
    public OperationController getOpenationController();
    public InterfaceController getInterfaceController();
}
interface OperationController{
    public void init();
    //其他方法声明省略
}
interface InterfaceController{
    public void init();
    //其他方法声明省略
}
class SymbianFactory implements AbstractFactory{
    public OperationController getOpenationController(){
       ____;    
    }
    public InterfaceController getInterfaceController(){
       ____;    
    }
}
class AndroidFactory ____{    
    public OperationController getOpenationController(){
        return new AndroidOperationController();
    }
    public InterfaceController getInterfaceController(){
        return new AndroidInterfaceController();
    }
}
class SymbianOperationController ____{    
    public void init(){
        //实现代码省略
    }
    //其他方法声明省略
}
class AndroidOperationController ____{    
    public void init(){
        //实现代码省略
    }
    //其他方法声明省略
}
class SymbianInterfaceController implements InterfaceController{
    public void init(){
        //实现代码省略
    }
    //其他方法声明省略
}
class AndroidInterfaceController implements InterfaceController{
    public void init(){
        //实现代码省略
    }
    //其他方法声明省略
}
class Test{
    public static void main(String[] args) {
        AbstractFactory af;
        ____ oc;    
        ____ ic;    
        af = new SymbianFactory();
        oc = ____;    
        ic = ____;  
        oc.init();
        ic.init();
    }
}
在上述设计方案中如何增加对Windows Mobile操作系统的支持?需对该设计方案进行哪些调整?简单说明实现过程____。

正确答案:

(1) return new SymbianOperationController()

(2) return new SymbianInterfaceController()

(3) implements AbstractFactory

(4) implements OperationController

(5) implements OperationController

(6)OperationController

(7) InterfaceController

(8)af.getOperationController()

(9) af.getInterfaceController()

(10) 如果需要增加对Windows Mobile操作系统的支持,需要增加三个类,其中WindowsOperationController作为OperationController接口的子类,WindowsInterfaceController作为InterfaceController接口的子类,再对应增加一个具体工厂类WindowsFactory实现AbstractFactory接口,并实现在其中声明的工厂方法,创建WindowsOperationController对象和WindowsInterfaceController对象

6. (填空题)某软件公司要开发一个音频和视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。现使用建造者模式设计该软件,所得类图如下所示:
请完成以下Java代码中的代码填空。
 


   在该设计方案中,MainScreen是播放器的主界面,它是一个复合对象,包括菜单、播放列表、主窗口和控制条等成员。ModeBuilder是一个抽象类,定义了一组抽象方法buildXXX()用于逐步构造一个完整的MainScreen对象,getScreen()是工厂方法,用于返回一个构造好的MainScreen对象。ScreenModeController充当指挥者,用于指导复合对象的创建,其中construct()方法封装了具体创建流程,并向客户返回完整的产品对象。
【Java代码】
class MainScreen{
    public String menu;
    public String playList;
    public String mainWindow;
    public String controlBar;
}
____class ModeBuilder{    
    protected MainScreen screen = new MainScreen();
    public abstract void buildMenu();
    public abstract void buildPlayList();
    public abstract void buildMainWindow();
    public abstract void buildControlBar();
    public MainScreen getScreen(){
      ____;      
    }
}
class FullModeBuilder extends ModeBuilder{
    public void buildMenu(){//实现代码省略}
    public void buildPlayList(){//实现代码省略}
    public void buildMainWindow(){//实现代码省略}
    public void buildControlBar(){//实现代码省略}
}
class SimpleModeBuilder extends ModeBuilder{
    public void buildMenu(){//实现代码省略}
    public void buildPlayList(){//实现代码省略}
    public void buildMainWindow(){//实现代码省略}
    public void buildControlBar(){//实现代码省略}
}
class ScreenModeController{
   private ModeBuilder mb;
   public void setModeBuilder(____){    
       this.mb = mb;
   }
   public MainScreen construct(){
       MainScreen ms;
       mb.buildMenu();
       mb.buildPlayList();
       mb.buildMainWindow();
       mb.buildControlBar();
       ms = ____;    
       return ms;
   }
}
class Test{
    public static void main(String[] args) {
        ScreenModeController smc = ____;    
        ModeBuilder mb;
        mb = new FullModeBuilder();//构造完整模式界面
        MainScreen screen;
        smc.setModeBuilder(____);    
        screen = ____;  
        System.out.println(screen.menu);
        //其他代码省略
    }
}

正确答案:

(1) abstract

(2) return screen

(3) ModeBuilder mb

(4) mb.getScreen()

(5) new ScreenModeController()

(6) mb

(7) smc.construct()

;