设计模式是一套可重用的解决方案,用于解决软件设计中的常见问题。
设计模式分为三大类:创建型模式、结构型模式和行为型模式。
一、创建型设计模式
创建型模式关注对象的创建过程,旨在以灵活和高效的方式创建对象。它们有助于将系统与对象的创建过程解耦,使系统更独立于具体实现。
-
单例模式(Singleton)
- 特点:确保一个类只有一个实例,并提供一个全局访问点。
- 使用场景:需要确保一个类只有一个实例,如配置管理器、资源管理器等。
-
工厂方法模式(Factory Method)
- 特点:定义一个创建对象的接口,但由子类决定实例化哪一个类。
- 使用场景:当具体类的实例化需要延迟到子类时,如日志记录器、连接池等。
-
抽象工厂模式(Abstract Factory)
- 特点:提供一个接口,用于创建一族相关或依赖对象,而无需指定具体类。
- 使用场景:系统需要一组相关或依赖的产品对象时,如UI组件的跨平台开发。
-
建造者模式(Builder)
- 特点:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
- 使用场景:需要创建复杂对象,且对象的创建过程独立于其组成部分时,如创建复杂的文档对象。
-
原型模式(Prototype)
- 特点:通过复制现有实例来创建新对象,避免重复的初始化过程。
- 使用场景:需要大量相似对象的场景,如编辑器中的图形工具。
二、结构型设计模式
结构型模式关注对象间的组合,以便更好地扩展和维护系统结构。
-
适配器模式(Adapter)
- 特点:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。
- 使用场景:现有类的接口不符合需求时,如旧系统的接口兼容问题。
-
桥接模式(Bridge)
- 特点:将抽象部分与它的实现部分分离,使它们可以独立变化。
- 使用场景:需要在抽象和实现之间进行解耦时,如跨平台UI工具。
-
组合模式(Composite)
- 特点:将对象组合成树形结构以表示“部分-整体”的层次结构。使得客户可以一致地对待单个对象和对象组合。
- 使用场景:需要表示对象的部分-整体层次结构时,如文件系统的目录结构。
-
装饰模式(Decorator)
- 特点:动态地给对象添加一些额外的职责,提供了比继承更灵活的扩展功能。
- 使用场景:需要动态地给对象添加功能时,如图形界面组件的装饰。
-
外观模式(Facade)
- 特点:为子系统中的一组接口提供一个一致的界面,使得子系统更容易使用。
- 使用场景:简化复杂系统的使用,如库的封装。
-
享元模式(Flyweight)
- 特点:运用共享技术来有效地支持大量细粒度对象的复用。
- 使用场景:需要大量细粒度对象且大部分状态可以共享时,如文本编辑器中的字符对象。
-
代理模式(Proxy)
- 特点:为其他对象提供一种代理以控制对这个对象的访问。
- 使用场景:需要控制对某个对象的访问时,如远程代理、虚拟代理等。
三、行为型设计模式
行为型模式关注对象之间的通信和职责分配,确保系统行为灵活、可扩展。
-
责任链模式(Chain of Responsibility)
- 特点:将请求沿着处理链传递,直到有一个对象处理它。
- 使用场景:多个对象可以处理同一请求,但具体处理者在运行时决定时,如事件处理机制。
-
命令模式(Command)
- 特点:将请求封装成对象,以便使用不同的请求、队列或日志请求来参数化其他对象。
- 使用场景:需要对请求进行参数化和记录日志时,如命令队列。
-
解释器模式(Interpreter)
- 特点:为语言的语法表示定义一个解释器,使用该解释器来解释语言中的句子。
- 使用场景:需要解释语言的场景,如编译器、规则引擎。
-
迭代器模式(Iterator)
- 特点:提供一种方法顺序访问聚合对象中的各个元素,而不暴露其内部表示。
- 使用场景:需要遍历聚合对象的不同方式时,如容器类的迭代。
-
中介者模式(Mediator)
- 特点:用一个中介对象来封装一系列对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散。
- 使用场景:对象之间的通信复杂且相互依赖时,如GUI组件的协作。
-
备忘录模式(Memento)
- 特点:在不破坏封装的前提下,捕获对象的内部状态,并在以后恢复它。
- 使用场景:需要保存和恢复对象状态时,如撤销功能。
-
观察者模式(Observer)
- 特点:定义对象间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并自动更新。
- 使用场景:一个对象的改变需要通知其他对象时,如事件监听机制。
-
状态模式(State)
- 特点:允许对象在内部状态改变时改变其行为,使得对象看起来像是改变了其类。
- 使用场景:对象行为随状态变化而变化时,如有限状态机。
-
策略模式(Strategy)
- 特点:定义一系列算法,把它们封装起来,并使它们可以互相替换。
- 使用场景:需要动态选择算法时,如不同的排序算法。
-
模板方法模式(Template Method)
- 特点:定义算法的骨架,而将一些步骤延迟到子类中。
- 使用场景:多个类具有相似的逻辑时,如框架的钩子方法。
-
访问者模式(Visitor)
- 特点:封装一些作用于某种数据结构中各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
- 使用场景:需要对不同类型的对象进行不同的操作时,如对象结构的操作。
如何分辨使用
-
创建型模式:当需要灵活的对象创建机制以避免复杂的实例化过程时使用,如单例模式确保唯一实例、工厂方法模式隐藏具体类、抽象工厂模式创建一族相关对象、建造者模式构建复杂对象、原型模式通过复制创建对象。
-
结构型模式:当需要简化对象间关系和提高系统结构的可维护性时使用,如适配器模式用于接口兼容、桥接模式用于解耦抽象和实现、组合模式用于表示部分-整体层次结构、装饰模式用于动态添加功能、外观模式用于简化接口、享元模式用于对象共享、代理模式用于控制访问。
-
行为型模式:当需要管理对象间的复杂通信和职责分配时使用,如责任链模式用于请求传递、命令模式用于请求封装、解释器模式用于语言解释、迭代器模式用于遍历对象、中介者模式用于对象通信、备忘录模式用于状态保存、观察者模式用于状态变化通知、状态模式用于行为变化、策略模式用于算法选择、模板方法模式用于算法骨架、访问者模式用于操作对象结构。