问题 问答题

试题五(共15分)阅读下列说明和C++代码,将应填入____(n)____处的字句写在答题纸的对应栏内。[说明]现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server和Access两种数据库以及系统中的数据库表Department为例,其类图如图5-1所示。

答案

参考答案:

解析:本题考查抽象工厂(Abstract Factory)模式的概念及应用。 Abstract Factory 模式的意图是,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。Abstract Factor模式的结构如下图所示。

其中,类AbstractFactory声明一个创建抽象产品对象的操作接口;类ConcreteFactory实现创建具体产品对象的操作;类ProductA为一类产品对象声明一个接口;类ConcreteProduct具有2个功能:定义一个将被相应的具体工厂创建的产品对象:实现ProductA接口;类Client仅使用由AbstractFactory和AbstractProduct类声明的接口。 在以下情况可以使用Abstract Factory模式: (1)一个系统要独立于它的产品的创建、组合和表示时; (2)一个系统要由多个产品系统中的一个来配置时; (3)当要强调一系列相关的产品对象的设计一边进行联合使用时; (4)提供一个产品类库,而只想显示它们的接口而不是实现时。 题目利用抽象工厂模式来解决在同一个软件系统中支持多种不同数据库的问题,这也是软件开发中比较常见的情形。其中的类IFactory相当于上图中的类AbstractFactory;类IDepartment相当于上图中的类ProdcutA。本题中只给出了一个产品类。 下面来分析程序。 第(1)、(2)空出现类IDepartment的定义中。类IDepartment的作用是为一类产品对象声明一个接口,在C++中通常都采用抽象类来定义这种抽象操作接口。C++中的抽象类是包含了至少一个纯虚拟函数的类。纯虚拟函数的语法是: virtual<函数名>(<参数列表>)=0; 在程序中已经出现了纯虚拟函数的标志“=0”,因此(1)、(2)空应该都是纯虚拟函数。下面来确定纯虚拟函数的原型。这需要去考察类IDepartment的子类,因此纯虚拟函数是在父类中定义,在子类中实现。由类图5-1可知,类IDepartment的子类分别是SqlserverDepartment和AccessDepartment。至此可以提前确定(3)、(4)空的内容了,即其所对应的父类。因此(3)、(4)空都应该填写public IDepartment。我们看类SqlserverDepartment中的方法,分别为:Insert和GetDepartment,而在类AccessDepartment中也出现了这两个方法,且接口完全一致。所以这两个方法就应该是类IDepartment中所定义的抽象接口。由此可知,(1)空应该填写virtual void Insert(Department*department),(2)空应该填写virtual Department GetDepartment(int id)。 空(5)和(6)分别缺失在类的名称以及该类中的方法。由图5-1和代码可知,缺少类IFactory的定义,所以(5)空处应该填写class IFactory。那么类IFactory应包含的方法是什么类IFactory的作用是声明一个创建抽象产品对象的操作接口,这个接口一定会同时出现在IFactory的子类SqlServerFactory和AccessFactory中,即CreateDepartment。(6)处同样应该是一个纯虚拟函数,所以(6)空处应该填写virtual IDepartment*CreateDepartment()。

单项选择题
单项选择题