设计模式学习笔记

什么是设计模式

设计模式是软件工程中的一种解决特定问题的方案,在软件开发过程中具有重要作用。设计模式是从众多成功项目中抽象出来的可复用的经验总结,目的在于提高软件的可维护性、灵活性、可复用性和可扩展性。

创建型模式

创建型模式是用于描述“怎样创建对象”的设计模式。包括以下五个模式:

工厂方法模式(Factory Method Pattern)

工厂方法模式定义一个用于创建对象的接口(工厂接口),让子类决定将哪一个类实例化。工厂方法使一个类的实例化延迟到其子类。

实例:Java中的Calendar类就使用了工厂方法模式来创建日期对象。

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

实例:JDK中的AWT和Swing包就使用了抽象工厂模式来创建界面组件。

单例模式(Singleton Pattern)

单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。

实例:Java中的运行时环境(Runtime)对象就是一个典型的单例模式。

建造者模式(Builder Pattern)

建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

实例:Java中的StringBuilder类就是一个建造者模式的应用。

原型模式(Prototype Pattern)

原型模式通过复制现有的实例来创建新的实例,而不是通过实例化操作来创建实例。

实例:Java中的Object.clone()方法就是原型模式的应用。

结构型模式

结构型模式是用于描述如何将类或对象按某种布局组成更大的结构的设计模式。包括以下七个模式:

适配器模式(Adapter Pattern)

适配器模式将一个类的接口转换为客户希望的另一个接口。适配器模式让那些由于接口不兼容而不能在一起工作的类可以一起工作。

实例:Java中的各种IO流就是适配器模式的应用。

桥接模式(Bridge Pattern)

桥接模式将抽象部分与它的实现部分分离开来,以便它们可以独立变化。

实例:Java中的AWT和Swing包中的事件机制就是桥接模式的应用。

装饰模式(Decorator Pattern)

装饰模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。

实例:Java中的IO流就是装饰模式的应用。

组合模式(Composite Pattern)

组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

实例:Java中的AWT和Swing包中的界面组件就是组合模式的应用。

外观模式(Facade Pattern)

外观模式为子系统提供一个统一的接口,使得子系统更易于使用。

实例:Java中的JDBC API就是外观模式的应用。

享元模式(Flyweight Pattern)

享元模式使用共享对象来避免大量小颗粒对象的创建,从而提高系统的性能。

实例:Java中的String类就是享元模式的应用。

代理模式(Proxy Pattern)

代理模式为其他对象提供一个代理以控制对这个对象的访问。

实例:Java中的远程方法调用(RMI)就是代理模式的应用。

行为型模式

行为型模式是用于描述对象间通信的设计模式。包括以下十一个模式:

职责链模式(Chain of Responsibility Pattern)

职责链模式将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求。

实例:Java中的异常处理机制就是职责链模式的应用。

命令模式(Command Pattern)

命令模式将一个请求封装成一个对象,从而可以用不同的请求对客户进行参数化。

实例:Java中的AWT事件模型就是命令模式的应用。

解释器模式(Interpreter Pattern)

解释器模式定义语言的文法,并且建立一个解释器来解释该语言中的句子。

实例:Java中的正则表达式就是解释器模式的应用。

迭代器模式(Iterator Pattern)

迭代器模式提供一种方法来访问一个容器对象中的各个元素,而又不需要暴露该对象的内部细节。

实例:Java中的集合框架就是迭代器模式的应用。

中介者模式(Mediator Pattern)

中介者模式定义一个中介对象来封装一系列对象之间的交互关系。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

实例:Java中的AWT和Swing包中的事件机制就是中介者模式的应用。

备忘录模式(Memento Pattern)

备忘录模式用于保存一个对象的某个状态,以便在适当的时候恢复该状态。

实例:Java中的流对象就使用了备忘录模式。

观察者模式(Observer Pattern)

观察者模式定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

实例:Java中的各种事件监听器机制就是观察者模式的应用。

状态模式(State Pattern)

状态模式允许对象在其内部状态改变时改变它的行为。

实例:Java中的线程生命周期机制就使用了状态模式。

策略模式(Strategy Pattern)

策略模式定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

实例:Java中的集合框架中的排序操作(Comparator)就是策略模式的应用。

模板方法模式(Template Method Pattern)

模板方法模式定义一个操作中的算法的骨架(固定不变的步骤),而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

实例:Java中的Servlet API中的doGet()和doPost()方法就是模板方法模式的应用。

访问者模式(Visitor Pattern)

访问者模式封装了作用于某种数据结构之上的一些操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。

实例:Java中的集合框架中的迭代器就是访问者模式的应用。

以上就是常用的23种设计模式,它们各有特点并且可以互相组合使用。