GOF设计模式详解:23种模式解析
需积分: 12 143 浏览量
更新于2024-09-11
收藏 56KB DOC 举报
"这篇文档介绍了GOF(GoF,Gang of Four)的经典设计模式,包括23种主要的设计模式,分为创建型、结构型和行为型三大类,适用于Java编程语言。这些模式是软件设计中常用的最佳实践,旨在提高代码的可重用性、可维护性和可扩展性。"
一、创建型模式
1. 抽象工厂(Abstract Factory):抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而不必关心它们的具体实现。这样可以在不同环境下创建相同接口的对象。
2. 建造者(Builder):建造者模式将一个复杂对象的构建与其表示分离,允许相同的构建过程创建不同的表示。它通过一个构建过程来逐步构造对象,避免了直接创建复杂对象的繁琐。
3. 工厂方法(Factory Method):工厂方法模式定义一个用于创建对象的接口,由子类决定实例化哪个类。它将类的实例化推迟到子类中,增强了系统的灵活性。
4. 原型(Prototype):原型模式使用原型实例来指定创建对象的种类,并通过复制原型来创建新对象。这种方法避免了直接构造新对象的开销,尤其适用于深拷贝的情况。
5. 单例(Singleton):单例模式确保一个类只有一个实例,并提供全局访问点。它常用于配置中心、缓存管理等需要全局共享的对象。
二、结构型模式
6. 适配器(Adapter):适配器模式将一个类的接口转换为客户期望的另一个接口,使得原本因接口不兼容而无法协作的类能够协同工作。
7. 桥接(Bridge):桥接模式将抽象部分与其实现部分分离,两者可以独立变化,提高了系统的可扩展性。
8. 组合(Composite):组合模式将对象组织成树形结构,表示部分-整体的层次关系。它使得客户对单个对象和组合对象的使用保持一致。
9. 装饰(Decorator):装饰模式动态地给一个对象添加额外的功能,比生成子类更加灵活,可以避免过多的子类。
10. 外观(Facade):外观模式为子系统提供一个统一的接口,简化了客户端与子系统之间的交互,降低了系统的复杂度。
11. 享元(Flyweight):享元模式使用共享技术来支持大量细粒度对象的高效使用,减少内存消耗。
12. 代理(Proxy):代理模式为其他对象提供一个代理,以控制对该对象的访问。代理可以用于控制访问权限、增加额外功能等。
三、行为型模式
13. 责任链(Chain of Responsibility):责任链模式将请求沿着处理者链传递,直到某个处理者处理请求。这种模式解耦了发送者和接收者,使得系统更灵活。
14. 命令(Command):命令模式将请求封装为对象,可以对请求进行参数化、队列化、记录请求日志,支持撤销操作。它简化了调用者与执行者之间的耦合。
15. 解释器(Interpreter):解释器模式定义一个语言的文法表示,并提供一个解释器来解释该语言的句子,常用于实现简单的脚本或表达式解析。
16. 迭代器(Iterator):迭代器模式提供了一种顺序访问聚合对象元素的方法,同时不暴露其内部表示,保证了数据结构的隐私。
17. 中介者(Mediator):中介者模式用一个中介对象来封装一系列对象的交互,降低它们之间的耦合度,使得对象之间的交互更加清晰。
18. 备忘录(Memento):备忘录模式在不破坏封装性的前提下,保存对象的状态,以便以后恢复。它常用于撤销/重做功能。
19. 观察者(Observer):观察者模式定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
20. 状态(State):状态模式允许对象在其内部状态改变时改变其行为,对象看起来好像改变了它的类。
21. 策略(Strategy):策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用它的客户端。
22. 模板方法(Template Method):模板方法模式在抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
23. 访问者(Visitor):访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变元素的类的前提下向其添加新的操作。
这些设计模式是软件设计的基石,它们帮助开发者解决常见的设计问题,提高代码的可读性、可维护性和复用性。理解并熟练应用这些模式,能提升软件开发的质量和效率。
107 浏览量
2014-05-08 上传
2021-03-09 上传
2011-08-05 上传
2021-06-06 上传
2012-02-04 上传
2012-07-31 上传
175 浏览量
koko2072
- 粉丝: 0
- 资源: 8
最新资源
- Background_removal_using_image_segmentation:使用FCN图像分割从图像视频中进行背景替换
- RAMSTUDIOS
- 高度可定制的用于Web音频的示波器:speaker_low_volume::microphone:-JavaScript开发
- redux-time:∞高性能的声明性JS动画库,用于构建游戏,数据可视化体验以及更多React,ThreeJS,Inferno,SnabbDOM等。
- bainyuanjiance.zip_图形图像处理_matlab_
- spotify-me:[javascript,ajax,api]
- hakyll-themes:来自社区的hakyll主题集合
- 在WPF中使用英特尔感知计算渲染颜色/深度流
- wp-user-groups:将用户与分类法和术语一起分组
- Python
- Web服务器:我的第一个Web服务器
- Flexbox-Framework:一个简单有效的基于flexbox的框架
- sp_sqrt.rar_matlab例程_Unix_Linux_
- pixel-weather:适用于桌面的像素化天气小部件
- Files:自用文件
- sandblaster:反转苹果沙箱