23种设计模式是经典的GOF设计模式,它们被分为三类:创建型模式、结构型模式和行为型模式。下面是每种模式的特点和应用场景:
创建型模式主要关注如何创建对象。这些模式可以根据需要动态地创建对象,而且可以将对象的创建过程与客户端代码进行分离,从而提高系统的灵活性和可扩展性。
特点:工厂方法模式通过一个工厂方法来创建对象,而不是直接使用new关键字。这样可以隐藏对象创建的细节,使得代码更加灵活、可扩展。
应用场景:工厂方法模式常用于创建复杂对象,尤其是当创建对象的过程中涉及到多个类时。比如说,一个类需要创建多个不同的对象,但是这些对象的创建过程相似,这时就可以使用工厂方法模式。
特点:抽象工厂模式提供了一个接口,用于创建一系列相关或依赖对象。这样可以将对象的创建过程与客户端代码分离,使得系统更加灵活、可扩展。
应用场景:抽象工厂模式常用于创建一系列相关的对象,比如说GUI界面中的组件。在GUI界面中,通常需要创建一系列相互依赖的组件,比如按钮、文本框等。这时可以使用抽象工厂模式来创建这些对象。
特点:单例模式确保一个类只有一个实例,并提供全局访问点。这样可以避免在系统中出现多个相同的对象,从而提高系统的性能和可维护性。
应用场景:单例模式常用于需要全局访问的对象,比如说日志记录器、数据库连接池等。
特点:原型模式通过复制现有的对象来创建新的对象。这样可以避免重复创建对象,从而提高系统的性能。
应用场景:原型模式常用于创建复杂对象,尤其是当对象的创建过程很耗时、耗资源时。比如说,一个复杂的对象需要从数据库中读取数据并进行计算,这时可以使用原型模式来避免重复读取数据库,提高系统的性能。
特点:建造者模式将一个复杂对象的构建过程分解成多个简单的步骤,从而使得构建过程更加灵活、可控。
应用场景:建造者模式常用于创建复杂的对象,尤其是当对象的构建过程涉及到多个步骤时。比如说,一个复杂的电子产品需要进行多次装配和调试,这时可以使用建造者模式来管理这个过程。
结构型模式主要关注如何通过对象和类的组合形成更大的结构。这些模式可以帮助我们将对象和类组织起来,从而更好地管理和维护系统中的各个部分。
特点:适配器模式将一个类的接口转换成客户端所期望的另一个接口。这样可以使得原本不兼容的类能够一起工作。
应用场景:适配器模式常用于将已有的类集成到新的系统中。比如说,一个新的系统需要使用一个已有的类,但是这个类的接口与系统不兼容,这时可以使用适配器模式来将这个类转换成新系统所期望的接口。
特点:桥接模式将一个对象的实现与其抽象分离开来,使得两者可以独立变化。这样可以使得系统更加灵活、可扩展。
应用场景:桥接模式常用于将系统的抽象部分和实现部分分离开来,使得它们可以独立变化。比如说,一个电子产品可以有多个型号和品牌,这时可以使用桥接模式将它们分离开来,从而使得系统更加灵活。
特点:组合模式将对象组合成树形结构,并以统一的方式处理这些对象。这样可以使得系统更加灵活、可扩展。
应用场景:组合模式常用于处理复杂的层次结构,比如说文件系统、GUI界面等。在这些系统中,通常需要对不同的对象进行统一处理,比如遍历、增加、删除等,这时可以使用组合模式来处理这些对象。
特点:装饰器模式允许动态地为一个对象添加额外的功能,而不需要修改原有的类。这样可以使得系统更加灵活、可扩展。
应用场景:装饰器模式常用于为一个对象添加额外的功能,比如说给一个GUI组件添加滚动条、边框等。在这些情况下,使用装饰器模式可以使得代码更加简洁、灵活。
特点:外观模式为一组复杂的子系统提供了一个统一的接口,从而使得这个子系统更加易于使用。
应用场景:外观模式常用于隐藏复杂的系统实现细节,使得系统更加易于使用。比如说,一个电子产品有多个组件,每个组件有不同的设置和控制方式,这时可以使用外观模式来为这些组件提供一个统一的控制界面。
特点:享元模式将一个类的实例分成多个共享的部分,从而减少了系统的内存占用。这样可以使得系统更加节省内存、更加高效。
应用场景:享元模式常用于处理大量相似的对象,比如说图形界面中的字母、数字等。在这些情况下,通常需要创建大量的对象,但是这些对象之间又存在大量的共同点,这时可以使用享元模式来共享这些共同点,从而减少系统的内存占用。
特点:代理模式为一个对象提供了一个替代品或占位符,从而可以控制对这个对象的访问。这样可以使得系统更加安全、可控。
应用场景:代理模式常用于需要对一个对象进行控制或限制访问的情况下。比如说,一个对象需要被多个线程或进程访问,但是需要进行访问控制,这时可以使用代理模式来控制对这个对象的访问。
行为型模式主要关注对象之间的通信和协作方式。这些模式可以帮助我们更好地组织对象之间的交互,从而更好地实现系统的功能。
特点:责任链模式将一个请求沿着一条链传递,直到有一个对象可以处理这个请求为止。这样可以使得系统更加灵活、可扩展。
应用场景:责任链模式常用于处理复杂的请求处理流程,比如说一个请求需要经过多个处理环节才能得到处理。在这些情况下,使用责任链模式可以使得系统更加灵活、可扩展。
特点:命令模式将一个请求封装成一个对象,从而可以对请求进行参数化、队列化、记录日志等操作。这样可以使得系统更加灵活、可扩展。
应用场景:命令模式常用于需要将请求进行参数化、队列化、记录日志等操作的情况下。比如说,一个系统需要对多个操作进行记录,这时可以使用命令模式来记录每个操作。
特点:迭代器模式提供了一种访问一个集合对象元素的方式,而不需要暴露这个对象的内部结构。这样可以使得系统更加灵活、可扩展。
应用场景:迭代器模式常用于处理集合对象的遍历操作,比如说对列表、树形结构等进行遍历。在这些情况下,使用迭代器模式可以使得系统更加灵活、可扩展。
特点:中介者模式将多个对象之间的交互关系封装到一个中介者对象中,从而减少对象之间的直接耦合。这样可以使得系统更加灵活、可扩展。
应用场景:中介者模式常用于处理多个对象之间的复杂交互关系,比如说一个系统中存在多个对象,这些对象之间需要相互通信,但是通信关系又非常复杂。在这些情况下,使用中介者模式可以将这些复杂的交互关系封装到一个中介者对象中,从而减少对象之间的直接耦合。
特点:备忘录模式可以在不破坏封装性的前提下,捕获一个对象的内部状态,并将该状态保存到外部存储器中。这样可以使得系统更加灵活、可扩展。
应用场景:备忘录模式常用于需要保存对象历史状态的情况下。比如说,一个系统需要记录对象的历史状态,这时可以使用备忘录模式来保存这些历史状态。
特点:解释器模式定义了一种语言语法的表示,并提供了解释器来解释这种语法。这样可以使得系统更加灵活、可扩展。
应用场景:解释器模式常用于处理一些需要进行解释的问题,比如说编译器、计算器等。在这些情况下,使用解释器模式可以将复杂的问题进行简化,从而使得系统更加灵活、可扩展。
特点:观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知。这样可以使得系统更加灵活、可扩展。
应用场景:观察者模式常用于处理多个对象之间的状态依赖关系,比如说一个对象的状态发生变化时,需要通知多个其他对象。在这些情况下,使用观察者模式可以使得系统更加灵活、可扩展。
特点:状态模式定义了一种状态机的模型,可以使得一个对象在不同状态下行为不同。这样可以使得系统更加灵活、可扩展。
应用场景:状态模式常用于处理一个对象的状态变化,比如说一个对象的状态发生变化时,需要改变它的行为。在这些情况下,使用状态模式可以使得系统更加灵活、可扩展。
特点:策略模式定义了一种算法的族,分别封装起来,使得它们之间可以相互替换。这样可以使得系统更加灵活、可扩展。
应用场景:策略模式常用于处理多个算法之间的选择问题,比如说一个系统需要根据不同的条件选择不同的算法。在这些情况下,使用策略模式可以使得系统更加灵活、可扩展。
特点:模板方法模式定义了一个算法的骨架,并将一些步骤延迟到子类中实现。这样可以使得系统更加灵活、可扩展。
应用场景:模板方法模式常用于处理一些算法的骨架问题,比如说一个算法的各个步骤已经确定,但是某些步骤需要延迟到子类中实现。在这些情况下,使用模板方法模式可以使得系统更加灵活、可扩展。
特点:访问者模式可以将数据结构与数据操作分离开来,使得数据结构可以不经常发生改变而不影响操作。
应用场景:访问者模式常用于处理一些数据结构与数据操作分离的情况,比如说一个系统需要对数据结构进行操作,但是数据结构的实现经常发生变化。在这些情况下,使用访问者模式可以使得系统更加灵活、可扩展。