23种设计模式
设计模式概述
设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案,是众多开发人员经过长期实践总结出来的最佳实践。它是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验总结。使用设计模式的目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,是软件工程的基石。
设计模式最早由埃里希·伽玛、约翰·弗利赛德斯、拉尔夫·约翰逊和理查德·赫尔姆这四位作者在1994年出版的《设计模式:可复用面向对象软件的基础》一书中提出。该书提供了23个模式来解决面向对象程序设计中的各种问题,被称为“四人组(Gang of Four,GoF)的书”。
设计模式分类
设计模式分为三大类:
- 创建型模式(Creational Patterns):创建型模式主要用于对象的创建,隐藏创建逻辑,而不是直接使用 new 操作符实例化对象。这些模式可以简化对象的创建过程,提供更好的灵活性和可扩展性。
创建型模式就是一种“聪明地造东西”的方法。想象一下,如果你每次想用一个东西,都得自己亲手从头开始造,那得多麻烦啊!创建型模式就是帮我们解决这个问题的,它让我们可以用更简单、更灵活的方式去“造”出我们需要的东西,而不是每次都用最原始的方法。 - 结构型模式(Structural Patterns):结构型模式主要用于对象的组合,用于实现类与对象的组合关系。这些模式可以帮助开发人员更好地组织代码结构,提高代码的可维护性和可扩展性。
结构型模式就好像是“搭积木”或者“拼装家具”。它的核心思想是:把不同的东西组合在一起,让它们变成一个更有用的整体。就像你买了一套家具,里面有桌子、椅子、柜子,通过合理地摆放和组合,它们就能变成一个温馨的客厅。结构型模式也是这样,它帮助我们把不同的对象或者类组合起来,让它们更好地协同工作,解决复杂的问题。 - 行为型模式(Behavioral Patterns):行为型模式主要用于用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
行为型模式就好像是“教人怎么做事”的方法。想象一下,你去参加一个舞会,大家都知道怎么跳舞,是因为有人教了大家舞步(比如华尔兹的舞步、探戈的舞步)。行为型模式也是类似的,它告诉对象们“怎么互动”“怎么做事”,让它们能够更好地协同完成任务。
设计模式详细列表
分类 | 设计模式 | 标准定义 | 通俗解读 |
---|---|---|---|
创建型模式 | 单例模式 (Singleton) | 确保一个类只有一个实例,并提供全局访问点。 | 就像总统只有一个,全国都知道怎么找到他。 |
原型模式 (Prototype) | 通过复制现有对象创建新对象,而非通过实例化。 | 用模具复制雕塑,快速得到相同作品。 | |
工厂方法模式 (Factory Method) | 定义创建对象的接口,由子类决定实例化的类。 | 蛋糕店让不同师傅按订单制作特定蛋糕。 | |
抽象工厂模式 (Abstract Factory) | 提供创建相关对象家族的接口,无需指定具体类。 | 家具店提供整套风格一致的桌椅沙发。 | |
建造者模式 (Builder) | 将复杂对象的构建与表示分离,允许相同构建过程创建不同形式。 | 建筑队按相同步骤建造不同风格的房子。 | |
结构型模式 | 适配器模式 (Adapter) | 将一个类的接口转换为客户端期望的接口,使不兼容的类协同工作。 | 电源转换器让美标插头适配国内插座。 |
桥接模式 (Bridge) | 将抽象部分与实现部分分离,使它们能独立变化。 | 遥控器可控制不同品牌的电视。 | |
组合模式 (Composite) | 将对象组合成树形结构以表示“部分-整体”层次。 | 文件夹可嵌套文件和子文件夹,统一管理。 | |
装饰器模式 (Decorator) | 动态地为对象添加额外职责。 | 给蛋糕加奶油或水果,增强外观和功能。 | |
外观模式 (Facade) | 为复杂子系统提供统一的高层接口。 | 酒店前台一站式处理订房、清洁、餐饮请求。 | |
享元模式 (Flyweight) | 通过共享技术支持大量细粒度对象的高效复用。 | 共享单车减少资源占用,按需分配。 | |
代理模式 (Proxy) | 为其他对象提供代理以控制访问。 | 明星经纪人过滤外界请求,保护隐私。 | |
行为型模式 | 模板方法模式 (Template Method) | 定义算法骨架,将某些步骤延迟到子类实现。 | 烹饪食谱固定步骤,调料由厨师自由发挥。 |
策略模式 (Strategy) | 封装一系列算法,使其可互相替换。 | 导航软件根据路况(拥堵/高速)切换路线算法。 | |
命令模式 (Command) | 将请求封装为对象,支持参数化、队列化操作。 | 餐厅订单记录顾客需求,厨师按顺序处理。 | |
责任链模式 (Chain of Responsibility) | 将请求沿处理链传递,直到有对象响应。 | 客服问题逐级上报,直到有人解决。 | |
状态模式 (State) | 允许对象在内部状态改变时改变行为。 | 交通灯根据状态(红/绿)切换通行规则。 | |
观察者模式 (Observer) | 定义对象间一对多依赖,状态变化时自动通知。 | 公众号更新时,所有订阅者收到推送。 | |
中介者模式 (Mediator) | 通过中介对象封装一系列对象交互。 | 机场塔台协调所有飞机的起降顺序。 | |
迭代器模式 (Iterator) | 提供顺序访问聚合对象元素的方法,不暴露内部结构。 | 书签帮助逐页阅读,无需知道书籍排版。 | |
访问者模式 (Visitor) | 在不修改元素类的前提下定义新操作。 | 博物馆导游为不同展品提供定制讲解。 | |
备忘录模式 (Memento) | 捕获对象内部状态并在外部保存,以便恢复。 | 游戏存档保存进度,可随时回退。 | |
解释器模式 (Interpreter) | 定义语言的文法,并解释语言中的句子。 | 翻译器将文言文转换为白话文。 |