教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

二十三种设计模式类图

来源:网络收集 时间:2026-09-09
导读: 二十三种设计模式类图 0 引言 谈到设计模式,绝对应该一起来说说重构。重构给我们带来了什么?除了作为对遗留代码的改进的方法,另一 大意义在于,可以让我们在写程序的时候可以不需事先考虑太多的代码组织问题,当然这其中也包括了应用模式的问题。尽管大多

二十三种设计模式类图

0 引言

谈到设计模式,绝对应该一起来说说重构。重构给我们带来了什么?除了作为对遗留代码的改进的方法,另一 大意义在于,可以让我们在写程序的时候可以不需事先考虑太多的代码组织问题,当然这其中也包括了应用模式的问题。尽管大多数开发者都已经养成了写代码前先 从设计开始的习惯,但是,这种程度的设计,涉及到到大局、到总体架构、到主要的模块划分我觉得就够了。换句话说,这时就能写代码了。这就得益于重构的思想 了。如果没有重构的思想,有希望获得非常高质量的代码,我们就不得不在开始写代码前考虑更多其实并非非常稳定的代码组织及设计模式的应用问题,那开发效率 当然就大打折扣了。在重构和设计模式的合理应用之下,我们可以相对较早的开始写代码,并在功能尽早实现的同时,不断地通过重构和模式来改善我们的代码质 量。所以,下面的章节中,在谈模式的同时,我也会谈谈关于常用的这些模式的重构成本的理解。重构成本越高意味着,在遇到类似的问题情形的时候,我们更应该 提前考虑应用对应的设计模式,而重构成本比较低则说明,类似的情形下,完全可以先怎么方便,怎么快怎么写,哪怕代码不是很优雅也没关系,回头再重构也很容 易。

1 创建型

1.1FactoryMethod

思想:Factory Method的主要思想是使一个类的实例化延迟到其子类。

场景:典 型的应用场景如:在某个系统开发的较早阶段,有某些类的实例化过程,实例化方式可能还不是很确定,或者实际实例化的对象(可能是需要对象的某个子类中的一 个)不确定,或者比较容易变化。此时,如果直接将实例化过程写在某个函数中,那么一般就是if-else或select-case代 码。如果,候选项的数目较少、类型基本确定,那么这样的if-else还是可以接受的,一旦情形变 得复杂、不确定性增加,更甚至包含这个构造过程的函数所

在的类包含几个甚至更多类似的函数时,这样的if-else代 码就会变得比较不那么容易维护了。此时,应用本模式,可以将这种复杂情形隔离开,即将这类不确定的对象的实例化过程延迟到子类。

实现:该模式的典型实现方法就是将调用类定义为一个虚类,在调用类定义一个专门用于构造不确定的对象实例的虚函数,再将实际的对象实例化代码 留到调用类的子类来实现。如果,被构造的对象比较复杂的话,同时可以将这个对象定义为可以继承、甚至虚类,再在不同的调用类的子类中按需返回被构造类的子 类。

重构成本:低。该模式的重构成本实际上还与调用类自己的实例化方式相关。如果调用类是通过Factory方 式(此处“Factory方式”泛指对象的实例化通过Factory Method或Abstract Factory这样的相对独立出来的 方式构造)构造的,那么,重构成本相对就会更低。否则,重构时可能除了增加调用类的子类,还要将所有实例化调用类的地方,修改为以新增的子类代替。可能这 样的子类还不止一个,那就可以考虑迭代应用模式来改善调用类的实例化代码。

1.2AbstractFactory

思想:不直接通过对象的具体实现类,而是通过使用专门的类来负责一组相关联的对象的创建。

场景:最典型的应用场景是:您只想暴露对象的接口而不想暴露具体的实现类,但是又想提供实例化对象的接口给用户;或者,您希望所有的对象能够 集中在一个或一组类(通常称作工厂类)来创建,从而可以更方便的对对象的实例化过程进行动态配置(此时只需要修改工厂类的代码或配置)。

实现:该模式的实现是比较清晰简单的,如上图,就是定义创建和返回各种类对象实例的工厂类。在最复杂而灵活的情形,无论工厂类本身还是被创建 的对象类都可能需要有一个继承体系。简单情形其实可以只是一个工厂类和需要被创建的对象类。不一定非要像上图中结

构那么完备(累赘)。

重构成本:中。如果一开始所有的对象都是直接创建,例如通过new实例化的, 而之后想重构为Abstract Factory模式,那么,很自然的我们需要替换所有直接的new实 例化代码为对工厂类对象创建方法的调用。考虑到像Resharper这样的重构工具的支持,找出对 某个方法或构造函数的调用位置这样的操作相对还是比较容易,重构成本也不是非常高。同时,重构成本还和被创建对象的构造函数的重载数量相关。您需要根据实 际情况考虑,是否工厂类要映射被创建对象的所有重载版本的构造函数。

1.3Builder

思想:将一个类的创建过程和他的主体部分分离。

场景:该模式的典型的应用场景是:一个类的创建过程可能比较复杂,或者创建过程中的某些阶段可能会容易变化;或者多个类的创建过程比较类似, 但是主体不同。

实现:在 以上提到的两种场景中,我们就可以取出一个类的创建过程的代码,定义一个专门的Builder类, 而在原来创建类对象实例的地方,将这个Builder类的实例作为参数传入。还有第二个重点,就是Builder类 可以将将整个创建过程分为几个阶段,每个阶段不必在类中直接实现,而可以通过继承体系在子类中实现,或者通过子类的方法过载来修改创建过程中的某个阶段, 但是重用其他的阶段。可以发现,该模式将一个对象的复杂创建过程重用到非常高的层次。这正是它的意义所在。

重构成本:低。该模式的重构成本我觉得是非常低的,因为一般来讲,创建过程的代码本来也就应该在原来的类的构造函数中,把它Extract出 来就好了。如果发现多个类的创建过程有比较多的代码重复或类似,那么就可以重用这些提取出来的Builder类 或者Builder类中的某些阶段。

1.4Prototype

思想:克 隆一个已有的类的实例(大家相比都用过甚至写过类的Clone实现,应该很容易理解了)。

场景:应 用Clone的场景应该说非常多,理想情况下我当然希望任何类都能Clone, 需要的时候就能Clone一份一模一样的出来。

实现:这 里将的实现主要之实现的表现形式,而不是如何用具体的语言来实现。因此,只要为需要Clone能力 的类定义一个Clone方法就行。当然,一般,主流的程序语言框架都已经定义了通用的Clone接 口(当然也可以自己定义),继承并实现该接口和方法就好。 重构成本:极低。不多解释了吧。 1.5 Singleton

思想:保证一个类只有一个唯一的实例。

场景:生活中有些对象就是只要一个就好了,我们的代码中为什么要每次都为这样的对象生成一个实例呢?

实现:最 简单的实现方式就是使用一个static型的类实例,每次对该对象的创建请求都返回这个static的 唯一实例就行。

重构成本:极低。

2 结构型

2.1Adapter

思想:将一个类的接口转换成另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

场景:该 模式的应用场景太多了,很多需要的功能模块的接口和我们需要的不完全一致或者有多余或不足,但是需要和我们的系统协同工作,通过Adapter把 它包装一下就能让使它接口兼容了。

实现:定 义一个Adapter类,包含需要包装的类,实现需要的其它接口,调用被包装的类的方法来实现需要 的接口。

重构成本:低。

2.2Bridge

思想:将一个类的抽象定义和具体实现解耦。

场景:该 模式的典型应用场景是:一个类的抽象定义已经确定,但是,其实现代码甚至原理可能会不同。比如:我们最熟悉的图形界面中的window的 实现,无论在什么操作系统,什么平台的机器上,一个window …… 此处隐藏:7944字,全部文档内容请下载后查看。喜欢就下载吧 ……

二十三种设计模式类图.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/977786.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)