《软件设计模式(Java 版)》
内容简介:本书从面向对象程序设计的 7 个基本原则出发,用浅显易懂、可视化的 UML 建模
语言逐一介绍 GoF 的 23 种经典设计模式。全书共 9 章,内容包括设计模式基础、创建型设
计模式(共 5 种)、结构型设计模式(共 7 种)、行为型设计模式(共 11 种)、设计模式
实验指导。每章包括教学目标、重点内容、模式的定义与特点、模式的结构与实现、模式的应
用场景与应用实例、模式的扩展、章节小结和单元习题等 8 方面的内容。
资源网址:http://www.ryjiaoyu.com/book/details/8402 (包括:电子课件 PPT、程序源
代码、各章的习题答案、课程标准、课程设计、实验指导书等)
作 者:程细柱
执行编辑:张斌
出版社:人民邮电出版社
出版日期:2018-06-01
书 号:978-7-115-47788-0
定 价:49.80 元
页 数:244
印刷方式:黑白印刷
开 本:16 开
习题答案:
第 1 章 软件设计模式基础
1.1 软件设计模式概述
1.2 UML 中的类图
1.3 面向对象的设计原则
一、名词解释
1. 一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个
系统的行为。
2. 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
3. 在软件中如果能够使用基类对象,那么一定能够使用其子类对象。
4. 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用
设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
二、单选择题
1. ( A )
6.( A )
11.( C )
三、多选择题
2.( A )
7. ( D )
3. ( A )
8.( D )
4. ( D )
9.( D )
5. ( D )
10.( E )
12.( C )
13. ( A )
1.( A、B、C、D )
2. ( A、B )
3.( A、D )
4.( A、B、C、D )
1
四、填空题
1.依赖倒转、迪米特法则、单一职责
2.模式名字 、 目的 、 问题 、 解决方案 、效果、 实例代码
3.超类、子类
4.开闭
5.用户
6.依赖倒转
7.组合/聚合
8.结构型 、 行为型
9. 依赖倒转
10. 开闭
11. 需求收集是否正确、体系结构的构建是否合理、测试是否完全
12.人与人之间的交流
13.接口
14.名称、 目的 、 解决方案
15.对象组合 、 类继承
16.对象组合
17.对象组合 、 类继承
18.抽象类的指针
五、 简答题
1.答:设计模式按类型分为以下三类:
1)创建型设计模式:以灵活的方式创建对象集合,用于管理对象的创建。
2)结构型设计模式:将己有的代码集成到新的面向对象设计中,用于处理类或对象
的组合。
3)行为型设计模式:用于描述对类或对象怎样交互和怎样分配职责。
2.答: 设计模式的主要优点如下:
1)设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它
提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交流,使得设计
方案更加通俗易懂。
2)设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技
术表述成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式使得重用成功
的设计更加容易,并避免那些导致不可重用的设计方案。
3)设计模式使得设计方案更加灵活,且易于修改。
4)设计模式的使用将提高软件系统的开发效率和软件质量,且在一定程度上节约设
计成本。
5)设计模式有助于初学者更深入地理解面向对象思想,一方面可以帮助初学者更加
方便地阅读和学习现有类库与其他系统中的源代码,另一方面还可以提高软件的设计水平
和代码质量。
3. 答:设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效
果、实例代码和相关设计模式,其中的关键元素包括模式名称、问题、解决方案和效果。
4. 答:正确使用设计模式具有以下优点:
2
⑴ 可以提高程序员的思维能力、编程能力和设计能力。
⑵ 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而
缩短软件的开发周期。
⑶ 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
5. 答:根据类与类之间的耦合度从弱到强排列,UML 中的类图有以下几种关系:依赖
关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。其中泛化和实现的耦
合度相等,它们是最强的。
6. 答:1)开闭原则(OCP):它要求软件实体应当对扩展开放,对修改关闭;
2)里氏替换原则(LSP):它要求继承必须确保超类所拥有的性质在子类中仍然成立;
3)依赖倒置原则(DIP):它要求软件设计要面向接口编程,不要面向实现编程;
4)单一职责原则(SRP):它要求对象不应该承担太多职责,一个类应该有且仅有一
个引起它变化的原因;
5)接口隔离原则(ISP):它要求程序员尽量将臃肿庞大的接口拆分成更小的和更具
体的接口,让接口中只包含客户感兴趣的方法;
6)迪米特法则(LoD):它要求如果两个软件实体无须直接通信,就不应当直接相互
调用,而通过第三方转发该调用;
7)合成复用原则(CRP):它要求在软件复用时,要尽量先使用组合或者聚合等关联
关系来实现,其次才考虑使用继承关系来实现。
第 2 章 创建型模式(上)
2.2 单例模式
2.3 原型模式
一、单选择题
1.( A )
6.( B )
2.( B )
7. ( B )
3. ( A )
4. ( D )
5. ( C )
二、多选择题
1.( C )
5.( A、C )
三、填空题
2. ( A,B )
6.( A、B、C、D )
3.( A、B )
7.( A,B,C,D )
4. ( A、B、C )
1.对象的创建、使用分离、耦合度
2.创建型
3.创建性
4.懒汉式单例 、 饿汉式单例
5. 抽象原型类 、 具体原型类
四、程序分析题
解:本题使用了单例模式,参考类图如下所示:
3
五、简答题
1. 答:创建型模式分为以下几种:
⑴ 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点
供外部获取该实例,其拓展是有限多例模式。
⑵ 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个
和原型类似的新实例。
⑶ 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定
生产什么产品。
⑷ 抽象工厂(Abstract Factory)模式:提供一个创建产品族的接口,其每个子类
可以生产一系列相关的产品。
⑸ 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据
不同需要分别创建它们,最后构建成该复杂对象。
2.答:单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用
中只维护一个特定类实例,它被所有组件共同使用。Java.lang.Runtime 是单例模式的经
典例子。从 Java 5 开始你可以使用枚举(enum)来实现线程安全的单例。
3. 答:单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建
这个实例的一种模式。
特点:1)单例类只有一个实例对象;2)该单例对象必须由单例类自行创建;3)单
例类对外提供一个访问该单例的全局访问点。
应用场景:1)在某类只要求生成一个对象的时候;2)当对象需要被共享的场合;
3)当某类需要频繁实例化,而创建的对象又频繁被销毁的时候。
4. 答:原型模式通常适用以下场景:1)对象之间相同或相似,即只是个别的几个属
性不同的时候;2)对象的创建过程比较麻烦,但克隆比较简单时候。
原型模式可扩展为:带原型管理器的原型模式,它在原型模式的基础上增加了一个原
型管理器 PrototypeManager 类。
第 3 章 创建型模式(下)
3.1 工厂方法模式
4
3.2 抽象工厂模式
3.3 建造者模式
一、单选择题
1. ( B )
6. ( C )
二、多选择题
2. ( A )
7. ( B )
3. ( C )
8. ( A )
4.( C )
9.( A )
5. ( D )
10.( A )
1.( A、B、C、D )
2.( A、B、C、D )
3.( A、C )
三、填空题
1.工厂方法 、 抽象工厂
2. 简单工厂
3. 抽象工厂(Abstract Factory) 、 具体工厂(Concrete Factory) 、抽象产
品 (Product)
4. 工厂方法、多个等级的产品
5. 抽象建造者(Builder)、具体建造者(ConcreteBuilder)、指挥者(Director)
五、简答题
1.答:工厂模式的最大好处是增加了创建对象时的封装层次。如果你使用工厂来创
建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要
在调用层做任何修改。应用场合是常常有新的对象类型要被添加进来,但你所关心的仅仅
是方法的接口,不关心其实现细节,本书中已经详细地介绍了其好处和应用环境。
2.答:工厂方法模式的主要优点有:1)用户只需要知道具体工厂的名称就可得到所
要的产品,无须知道产品的具体创建过程;2)在系统增加新的产品时只需要添加具体产
品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则。
其缺点是:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增
加了系统的复杂度。
3.答:工厂方法模式中考虑的是一类产品的生厂,如:电视机工厂;而抽象工厂模式
考虑多类产品的生产,如:电器工厂。
工厂方法模式通常适用以下场景:1)客户只知道创建产品的工厂名,而不知道具体的
产品名。如:TCL 电视工厂、海信电视工厂等;2)创建对象的任务由多个具体子工厂中
的某一个完成,而抽象工厂只提供创建产品的接口。3)客户不关心创建产品的细节,只
关心产品的品牌。
抽象工厂模式通常适用以下场景: 1)当需要创建的对象是一系列相互关联或相互依赖的
产品族时,如:电器工厂中的电视机、洗衣机、空调等;2)系统中有多个产品族,但每次只
使用其中的某一族产品。如:有的粉丝只喜欢穿李宁牌的衣、裤和鞋;3)系统中提供了产品
的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
4.答:产品的种类称为产品等级,而一个具体工厂所生产的位于不同等级的一组产品
称为一个产品族。
5
5.答:建造者模式的定义: 指将一个复杂对象的构造与它的表示分离,使同样的构建
过程可以创建不同的表示,这样的设计模式被称为建造者模式。
该模式的主要优点是: 1)各个具体的建造者相互独立的,有利于系统的扩展;2)
客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点是:1)产品的组成部分必须相同,这限制了其使用范围;2)如果产品的内部
变化复杂,该模式会增加很多的建造者类。
建造者模式通常在以下场合使用: 1)创建的对象较复杂,由多个部件构成,各部件
面临着复杂的变化,但构件间的建造顺序是稳定的;2)创建复杂对象的算法独立于该对
象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
六、编程题
说明:1-5 编程题可参考本章节的实例自己实现。
第 4 章 结构型模式(上)
4.2 代理模式
4.3 适配器模式
4.4 桥接模式
一、单选择题
1. ( A )
6. ( C )
二、多选择题
2.( A )
7. ( D )
3. ( D )
4. ( B )
5. ( A )
1.( A、D )
2. ( A、B、D )
3.( A、C、D )
4. ( A、B、C )
三、填空题
1. 适配器(Adapter)模式 、桥接(Bridge)模式、装饰(Decorator)模式、外观
(Facade)模式 、享元(Flyweight)模式
2. 真实主题(RealSubject)类 、 代理(Proxy)类
3. 动态代理模式
4.继承 、 组合/聚合
5. 适配者(Adaptee)类 、 适配器(Adapter)类
6.桥接
7. 适配器
四、 程序分析题
解:1)本题使用了代理器模式;
2)其参考结构图如下所示:
6
五、简答题
1. 答: 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户
端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
代理模式有以下的应用场景:1)为了隐藏目标对象存在于不同地址空间的事实,方
便客户端访问时;2)要创建的目标对象开销很大时;3)控制不同种类客户对真实对象的
访问权限时;4)当调用目标对象需要附加一些额外的处理功能时;5)为了提高系统的性
能,需延迟对目标的加载时。
2. 答:代理模式的主要优点有:1)代理模式在客户端与目标对象之间起到一个中介
作用和保护目标对象的作用;2)代理对象可以扩展目标对象的功能;3)代理模式能将客
户端与目标对象分离,在一定程度上降低了系统的耦合度。
其主要缺点是:1)在客户端和目标对象增加一个代理对象,会造成请求处理速度变
慢;2)增加了系统的复杂度。
3. 答:远程代理:这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方
便客户端访问。例如用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬
盘,用户访问它实际访问的是网盘空间。
虚拟代理:这种方式通常用于要创建的目标对象开销很大时。比如下载一幅很大的图
像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代
理替换真实的对象,消除用户对服务器慢的感觉。
安全代理:这种方式通常用于控制不同种类客户对真实对象的访问权限。
4. 答:适配器模式(Adapter)的定义如下: 将一个类的接口转换成客户希望的另外
一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分
为类结构型模式和对象结构型模式 2 种,前者类之间的耦合度比后者高,且要求程序员
了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
7
Java 例子可参考本章节相关实例设计。
5. 答:适配器模式通常适用以下场景: 1)以前开发的系统存在满足新系统功能需求
的类,但其接口同新系统的接口不一致;2)使用第三方提供的组件,但组件接口定义和
自己要求的接口定义不同。
应用实例可参考本章节相关实例设计。
6. 答:桥接模式的定义如下: 将抽象与实现分离,使他们可以独立的变化。它是用组
合关系代替继承关系来实现,从而降低了抽象和实现这 2 个可变维度的耦合度。
其优点是: 1)由于抽象与实现分离,所以扩展能力强;2)其实现细节对客户透明。缺
点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加
了系统的理解与设计难度。
六、综合题
1.解:本题可使用适配器模式和抽象工厂模式,参考类图如下所示:
8