23种设计模式
设计模式是软件工程中用于解决特定问题的通用解决方案。常见的设计模式有24种,通常分为三大类:创建型、结构型和行为型。下面是对这24种设计模式的详细解释及其归类:
1. 创建型模式
1.1 单例模式 (Singleton)
- 目的:确保一个类只有一个实例,并提供一个全局访问点。
- 适用场景:系统中需要一个唯一的类实例,如配置管理、日志记录等。
1.2 工厂方法模式 (Factory Method)
- 目的:定义一个创建对象的接口,但让子类决定实例化哪一个类。
- 适用场景:当一个类不知道它所需要的对象的具体类时,使用工厂方法创建对象。
1.3 工厂方法模式 (Abstract Factory)
- 目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体类。
- 适用场景:需要创建多个系列对象时,如用户界面工具包(按钮、文本框等)。
1.4 建造者模式 (Builder)
- 目的:使用多个简单的对象一步步构建一个复杂的对象。
- 适用场景:创建一个复杂对象的过程需要多个步骤,并且这些步骤可能会有变化时。
1.5 原型模式 (Prototype)
- 目的:通过复制现有的实例来创建新的实例,而不是通过实例化新的对象。
- 适用场景:当对象创建成本较高时,使用现有的对象复制更为高效。
2. 结构型模式
2.1 适配器模式 (Adapter)
- 目的:将一个类的接口转换成客户希望的另一种接口,使得原本由于接口不兼容而无法一起工作的类能够一起工作。
- 适用场景:需要将旧系统与新系统兼容时,或者在不同接口之间转换。
2.2 桥接模式 (Bridge)
- 目的:将抽象部分与实现部分分离,使得它们可以独立变化。
- 适用场景:在需要将抽象部分与其实现部分解耦,并且它们可能会独立变化时。
2.3 组合模式 (Composite)
- 目的:将对象组合成树形结构以表示部分-整体层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
- 适用场景:需要处理部分和整体的层次结构,如文件系统的目录和文件结构。
2.4 装饰者模式 (Decorator)
- 目的:动态地给对象添加额外的职责,而不改变其结构。
- 适用场景:需要在运行时为对象添加新功能,而不影响其他对象。
2.5 外观模式 (Facade)
- 目的:为一组接口提供一个统一的高层接口,使得子系统更易使用。
- 适用场景:需要简化接口或者对复杂子系统进行简化时。
2.6 享元模式 (Flyweight)
- 目的:通过共享对象来支持大量的细粒度对象,提高系统性能。
- 适用场景:需要大量的相似对象而这些对象的创建开销很大时。
2.7 代理模式 (Proxy)
- 目的:为其他对象提供一种代理以控制对这个对象的访问。
- 适用场景:需要控制对对象的访问、延迟加载、或者增加功能(如日志)时。
3. 行为型模式
3.1 责任链模式 (Chain of Responsibility)
- 目的:将请求的发送者和接收者解耦,使多个对象都有机会处理请求,形成一条链。
- 适用场景:需要处理请求的对象链时,如事件处理系统。
3.2 命令模式 (Command)
- 目的:将请求封装成一个对象,从而使你可以使用不同的请求、排队请求、记录请求日志,以及支持可撤销操作。
- 适用场景:需要将操作封装成对象以实现命令队列、操作撤销等功能时。
3.3 解释器模式 (Interpreter)
- 目的:为语言定义一个文法,并提供一个解释器来解释语言中的句子。
- 适用场景:需要解释或处理特定文法或语言时,如编程语言解析器。
3.4 迭代器模式 (Iterator)
- 目的:提供一种方法顺序访问集合对象中的元素,而不暴露集合对象的内部表示。
- 适用场景:需要遍历集合对象的元素时。
3.5 中介者模式 (Mediator)
- 目的:定义一个对象,通过封装一系列对象的交互来促进对象之间的松耦合。
- 适用场景:需要处理对象之间复杂的交互时。
3.6 备忘录模式 (Memento)
- 目的:在不暴露对象内部状态的情况下,保存和恢复对象的状态。
- 适用场景:需要保存和恢复对象的状态,如撤销操作。
3.7 状态模式 (State)
- 目的:允许对象在其内部状态改变时改变它的行为。
- 适用场景:对象的行为依赖于其状态,并且状态可能会发生变化时。
3.8 策略模式 (Strategy)
- 目的:定义一系列算法,将每一个算法封装起来,并使它们可以互换。
- 适用场景:需要在运行时选择算法或策略时。
3.9 模板方法模式 (Template Method)
- 目的:定义一个操作的算法的骨架,将一些步骤延迟到子类中。
- 适用场景:需要定义一个算法的步骤,并允许子类修改某些步骤的实现时。
3.10 访问者模式 (Visitor)
- 目的:表示一个作用于对象结构中的各个元素的操作,使得你可以在不改变元素类的前提下定义作用于这些元素的新操作。
- 适用场景:需要对对象结构中的元素执行一些操作,并且希望在不改变元素类的情况下添加新操作时。
3.11 观察者模式 (Observer)
- 目的:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象的状态变化。这样,当主题对象的状态发生变化时,所有依赖于它的观察者都会收到通知并自动更新。
- 适用场景:
- 当一个对象的状态变化需要通知其他多个对象,而这些对象又不知道彼此的情况时。
- 当一个对象的改变需要触发多个不同的响应时,观察者模式可以解耦状态和响应之间的关系。
- 在实现分布式事件处理系统时,也很适合使用观察者模式,比如用户界面组件和数据模型的同步。