Java程序员必须掌握的15个设计模式,特点和使用场景汇总整理!

设计模式是一种广泛使用的编程思想,它是一种用于解决特定问题的经验性方法,提供了一套通用的解决方案,可用于不同的应用场景,可以帮助我们解决常见的问题并提高代码的可重用性和可维护性。

设计模式分为三类:创建型设计模式、结构型设计模式和行为型设计模式

创建型设计模式用于封装对象的创建过程,它们可以帮助我们在不暴露对象创建过程的情况下创建对象。以下是常见的创建型设计模式:

工厂方法模式(Factory Method Pattern)是一种用于封装对象创建过程的模式。它定义了一个创建对象的接口,但让子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到其子类。

优点:子类可以在运行时决定创建的对象类型,而且可以避免客户端与具体类耦合。同时,它也很容易增加新的产品线。

使用场景:当我们需要隐藏对象创建过程,并让客户端通过抽象接口来创建对象时,可以考虑使用工厂方法模式。例如,当我们需要创建不同的消息对象时,可以使用工厂方法模式来创建消息对象。

抽象工厂模式(Abstract Factory Pattern)是一种用于创建相关或独立对象族的模式。它提供了一种接口,该接口可以创建一系列产品,但不需要指定具体的产品类。

优点:它可以隐藏产品的具体实现,以及如何创建这些产品。同时,它也使得客户端可以独立于具体的产品创建过程。

使用场景:当我们需要创建一系列相关或独立的对象时,可以考虑使用抽象工厂模式。例如,当我们需要创建一系列不同类型的手机和电视时,可以使用抽象工厂模式。

单例模式(Singleton Pattern)是一种用于限制类的实例化次数的模式。它保证一个类只有一个实例,并提供全局访问点。

优点:它可以节省系统资源,并且可以避免多个对象之间的冲突。

使用场景:当一个类只需要一个实例时,可以考虑使用单例模式。例如,当一个类需要负责管理应用程序的配置信息时,可以使用单例模式。

建造者模式(Builder Pattern)是一种用于封装复杂对象构建过程的模式。它将对象的构建和表示分离,使得相同的构建过程可以创建不同的表示。

优点:它可以灵活地创建对象,并且可以避免重复的构建过程。同时,它也很容易扩展,因为每个部件都是独立的。

使用场景:当我们需要构建一些复杂的对象时,可以考虑使用建造者模式,例如,当我们需要创建一个电子商品时,可以使用建造者模式来创建商品对象。

原型模式(Prototype Pattern)是一种用于创建对象的模式,它通过复制现有的对象来创建新的对象。原型模式通过克隆现有对象来创建新对象,而不是通过调用构造函数。

优点:它可以减少对象创建的开销,并且可以最大限度地利用已有对象。同时,它还可以避免构造函数的限制。

使用场景:当我们需要创建大量相似的对象时,可以考虑使用原型模式,例如,当我们需要创建多个相似的线图或柱图对象时,可以使用原型模式来复制现有的对象。

结构型设计模式用于将对象组合成更大、更复杂的结构,以便于更好地组织代码。以下是常见的结构型设计模式:

适配器模式(Adapter Pattern)是一种用于将不兼容的对象转换为兼容对象的模式。它通过使一个类的接口适用另一个接口来完成这个过程。适配器模式既可以是类适配器,也可以是对象适配器。

优点:它可以使得原本不兼容的对象可以协同工作。同时,它还可以减少代码的冗余。

使用场景:当我们需要将一个类的接口转换为其他类所期望的接口时,可以考虑使用适配器模式。例如,当我们需要将一个第三方类库的接口转换为我们的应用程序所期望的接口时,可以使用适配器模式。

桥接模式(Bridge Pattern)是一种用于将抽象和实现分离的设计模式。它通过使用一个中间类来链接抽象和实现,使得它们可以独立地变化。

优点:它可以减少类之间的耦合,并且可以使得抽象和实现可以独立地进行变化。

使用场景:当我们需要将抽象和实现分离,并且需要对它们进行独立的变化时,可以考虑使用桥接模式。例如,当我们需要将一个笔刷分为硬笔刷和软笔刷时,可以使用桥接模式来实现。

组合模式(Composite Pattern)是一种用于将对象组成树形结构的模式。它将单个对象和组合对象中的对象统一看作一个对象,这样用户无需了解其中细节即可处理它们。

优点:它可以简化客户端代码,并且可以使得增加或删除节点时非常容易。

使用场景:当我们需要组合单个对象和组合对象时,可以使用组合模式。例如,当我们需要创建一个菜单时,可以使用组合模式来组合不同的菜单项。

装饰器模式(Decorator Pattern)是一种用于动态地给对象添加职责的模式。它在不改变原有类的基础上,通过将对象包装在一个装饰器类中,来实现对对象功能的扩展。

优点:它可以在运行时动态地扩展一个对象的职责,而不需要修改源代码。同时,它也很容易扩展,因为每个装饰器都是独立的。

使用场景:当我们需要在运行时动态地扩展一个对象的功能时,可以考虑使用装饰器模式。例如,当我们需要给某个对象动态地添加日志、验证或缓存等功能时,可以使用装饰器模式。

外观模式(Facade Pattern)是一种用于隐藏复杂子系统的复杂性,并提供一个简单接口的模式。外观模式将复杂的子系统组合在一起,并提供一个简单接口来简化客户端调用。

优点:它可以简化客户端代码,并且可以隔离复杂子系统的实现细节。

使用场景:当我们需要对复杂子系统进行封装,并提供一个简单接口时,可以考虑使用外观模式。例如,当我们需要对数据库进行操作时,可以使用外观模式来封装数据库访问过程。

行为型设计模式关注对象之间的通信和协作。以下是常见的行为型设计模式:

策略模式(Strategy Pattern)是一种用于定义一系列算法,以及提供一种在运行时可以切换算法的方式的模式。该模式允许算法独立于客户端而变化。

优点:它可以很容易地替换算法,并且可以避免使用大量的条件语句。同时,它也可以提高代码的可扩展性和可维护性。

使用场景:当我们需要在运行时根据不同的需求选择不同的算法时,可以考虑使用策略模式。例如,当我们需要根据不同的用户类型计算不同的折扣时,可以使用策略模式来实现。

观察者模式(Observer Pattern)是一种用于对象之间的一对多依赖关系的模式。当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新状态。

优点:它可以使得对象之间的耦合度更低,并且可以提高代码的可维护性和可扩展性。

使用场景:当我们需要建立对象之间一对多的依赖关系时,可以考虑使用观察者模式。例如,当我们需要实现一个简单的消息通知系统时,可以使用观察者模式来实现。

命令模式(Command Pattern)是一种将请求封装成对象的模式,以便于存储、传递和使用。命令模式将请求接收者和请求发送者从彼此解耦,使得请求可以被重复执行、取消和排队。

优点:它可以对请求进行操作,并且可以灵活地添加新的命令,同时也可以很容易地撤销和重做操作。

使用场景:当我们需要对操作进行封装,并且需要支持撤销和重做操作时,可以考虑使用命令模式。例如,当我们需要实现一个简单的文本编辑器时,可以使用命令模式来实现。

迭代器模式(Iterator Pattern)是一种提供一种方法顺序访问聚合对象中各个元素的模式。迭代器模式将集合和遍历操作分离开来,使得可以对集合进行不同方式的遍历,而无需改变集合本身的结构。

优点:它可以隔离遍历算法和数据结构,并且可以简化遍历代码。

使用场景:当我们需要遍历一系列对象时,可以考虑使用迭代器模式。例如,当我们需要对一个图像集合进行遍历时,可以使用迭代器模式来实现。

责任链模式(Chain of Responsibility Pattern)是一种用于将多个处理对象连成一条链,并依次处理请求的模式。每个处理对象都可以决定是否处理请求,以及是否将请求传递给下一个处理对象。

优点:它可以避免客户端和处理对象之间的耦合,同时也可以提高代码的可扩展性和可维护性。

使用场景:当我们需要将请求发送给多个处理对象,并且让它们依次处理请求时,可以考虑使用责任链模式。例如,当我们需要处理一个订单时,可以使用责任链模式来处理订单状态的变化。

本文介绍了三种常见的设计模式:创建型设计模式、结构型设计模式和行为型设计模式。这些模式都有各自的优点和使用场景,可以帮助开发人员更好地组织代码,并提高代码的可扩展性和可维护性。在实际开发过程中,我们应该根据不同的需求选择不同的模式,并灵活地使用它们。

在后续的文章合集中,我会详细介绍每一种设计模式的原理及其使用场景,请关注我的后续文章。【】

对于本文中整理的设计模式,不知道你有没有什么看法,欢迎在评论区里留言。如果你对我的文章内容感兴趣,请点击关注,谢谢支持! [谢谢][谢谢][谢谢]

谈谈我工作中的23个设计模式,秒懂Java设计模式,上集

谈谈我工作中的23个设计模式

创作不易,关注、点赞,分享,转发,评论,收藏

叙述

从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是对抽象归纳的一个比较好的解决思路。在日常工作中,运用Java设计模式思路,可以更好地去思考理解这些设计模式。

抽象工厂就是围绕一个超级工厂创建其他工厂。这个超级工厂也被称为其他工厂的工厂。抽象工厂模式属于创造性模式,它提供了创建对象的最佳方式。在抽象工厂中,接口是负责创建相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都可以根据工厂模式提供对象。

介绍

意图:提供一个创建一系列相关或相互依赖对象的接口方法,无需指定它们具体的类。

主要解决:解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

在工作中,我们应该具备提供多套设计方案的能力,提供多种选择性。需要有这样的前瞻意识,扩展自己的思维方式。

以下是抽象工厂概述图

构建器,也称为构建器模式,使用几个简单的对象逐步构建一个复杂的对象。构建器模式属于创造性模式,它提供了创建对象的最佳方式。

介绍

意图:将一个复杂的构建与其具体实现相分离,使得同样的构建过程可以创建不同的表现形式。

主要解决:主要解决在软件系统中,有时候面临着\”一个复杂对象\”的创建工作。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:创建和提供实例,管理建造出来的实例的依赖关系。

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。

总的来说,在工厂模式中,我们创建对象的过程中,不会对客户端暴露创建逻辑,通过使用共同的接口,来指向新创建的对象。

工厂方法模式是将提供某一产品的过程进行抽象,通过接口的模式去规范出来。如果我们转换思维,处理问题的思维逻辑,终究是发现事物的本质:

  1. 到底在做什么
  2. 我们的职责是什么
  3. 提供什么样的价值。

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这原型模式属于创建型模式,它提供了一种创建对象的最佳方式。

原型模式是实现了一个原型接口,该接口用于创建当前对象的克隆。原型模式是说,利用拷贝对象的方法,减少一些复杂的创建过程。

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式属于创建型模式,提供了一种创建对象的方式。单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

介绍

意图:一个类仅有一个实例,具备全局访问点。

主要解决:全局使用的类频繁进行创建与销毁。

何时使用:当节省系统资源。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的

单件模式是说在多线程的情况下,要保证对象只创建一遍,作为独一无二的资源。

单例模式的几种实现方式

单例模式的实现有多种方式,如下所示:

是否 Lazy 初始化:

是否多线程安全:

实现难度:

是否 Lazy 初始化:

是否多线程安全:

实现难度:

是否 Lazy 初始化:

是否多线程安全:

实现难度:

JDK 版本:JDK1.5 起

是否 Lazy 初始化:

是否多线程安全:

实现难度:较复杂

是否 Lazy 初始化:

是否多线程安全:

实现难度:一般

JDK 版本:JDK1.5 起

是否 Lazy 初始化:

是否多线程安全:

实现难度:

适配器模式(Adapter Pattern)作为两个不兼容的接口之间的桥梁。适配器模式属于结构型模式。适配层往往不是提前的设计,而是基于现有现有的系统进行的妥协和适配。

结构图

介绍

意图:将一个类的接口转换成客户希望的另外一个接口。

主要解决:解决在软件系统中,将一些\”现存的对象\”放到新的环境中,而新环境要求的接口是现对象不能满足的应用场景。

何时使用:

1、系统需要使用现有的类,而此类的接口不符合系统的需要。

2、通过接口转换,将一个类插入另一个类系中。

如何解决:继承或依赖。

关键代码:适配器继承或依赖已有的对象,实现想要的接口。

总的来说,适配器是为了结合原来的能力,适配新的接口服务,比如适配不同的协议入口。

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。桥接设计模式属于结构型模式.

结构图

介绍

意图:将抽象与实现分离,都可以独立的变化。

主要解决:在有多种可变的情况下,用继承会造成类扩展性不高,运用起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

桥接模式是将原来相互依赖的部分,通过上层接口再往抽象层提一下,减少类之间的直接合作,形成间接关系。

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。

结构图

介绍

意图:使用户对单个对象和组合对象的使用具有一致性。

主要解决:客户程序可以处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用:

1、对象的部分-整体层次结构(树形结构)。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

组合模式通过继承和孩子节点,可以递归地去描述一个对象层次。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。