常用设计模式
单例模式
(关键:new 一个 static 对象)
- 一个类只有一个示例,最典型就是Sping Ioc。
优点
- 只有一个对象,节省资源,提高系统性能。
- 避免共享资源被重复占用,如程序计数器、资源文件的访问,对线程安全有一定帮助。
- 允许可变数目的实例,自己new就可以。
缺点
- 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
- 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
应用场景
- Spring Ioc
- 程序中的计数器。
- windows系统下的任务管理器,试试看,只能打开一个。
- 需要频繁实例化然后销毁的对象。
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象,而且不变化的对象。
- 有状态的工具类对象。
- 频繁访问数据库或文件的对象。
总结
单例模式一般出现在以下情况下:
- 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
- 控制资源的情况下,方便资源之间的互相通信。如线程池等。
简单工厂模式
(关键:new对象的逻辑放到工厂中)
优点
- 封装:将逻辑封装到接口中。
- 解耦:本来要自己new对象的,耦合度比较强,现在放到工厂中。
缺点
- 增加实例,就要修改工厂类。破坏了开闭原则,还是存在一些耦合,所以才会有工厂方法模式。
应用场景
- 很多要对数据进行判断处理的都需要这么做。
- Spring的BeanFactory
工厂方法模式
(关键:为了解决简单工厂违背开闭原则的缺陷,不需要将逻辑放到工厂中,而是每个实例就创建一个工厂类,用于处理相关逻辑)
优点
- 克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。
缺点
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
- 代码还是和子工厂耦合在一起,出现变动时会比较麻烦。
应用场景
- 很多地方都可以用到,有时还可以和简单工厂一起使用。
抽象工厂模式
区别
工厂方法模式:
- 一个抽象产品类,可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类可以创建多个具体产品类的实例。
区别:
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
优点
- 在工厂方法的基础上,对产品做更细致的抽象。
- 更强的灵活性。
缺点
- 工作量更多。
代理模式
(关键:在我们的实现类外面再包一层,以达到我们想要实现的功能)
优点
- 解耦,职责更清晰,关节业务和我们需要加的功能分离开。
- 保护目标对象,在客户端和目标对象之间形成一个中介,可以记录过程和保护目标对象。
- 高扩展性,以后可以修改代理而不修改目标对象。
缺点
- 额外开发工作
- 由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
应用场景及分类
- 远程代理:为不同地理的对象提供局域网代表对象。
- 虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建。
- 保护代理:控制对一个对象的访问权限。
- 智能引用代理:提供对目标对象额外的一些服务,如记录日志。
- Cache代理
- 防火墙代理
- 同步化代理
命令模式
(关键:某个方法需要完成某一个功能,完成这个功能的大部分步骤已经确定了,但可能有少量具体步骤无法确定,必须等到执行该方法时才可以确定。在方法参数中加一个命令对象作为参数,当执行时调用命令对象的方法。)
优点
- 将少数不相同的步骤解耦出来。
- 新的命令很容易加入到系统中,并且可以方便的制定各种命令和利用现有命令组合出新的命令。
- 调用同一个方法,实现不同功能。
缺点
- 开发量增加
适用场景
- 当需要对行为进行“记录、撤销/重做”等处理时。
- 系统需要将请求者和接收者解耦,使得调用者和接收者不直接交互。
- 系统需要在不同时间指定请求、请求排队和执行请求。
- 系统需要将一组操作组合在一起,即支持宏命令。
策略模式
(关键:建一个Context,相当于一个工厂,用于判断执行什么算法,每个算法一个类)
优点
- 在解耦的同时,减少重复代码。
- 原本逻辑和算法耦合在客户端,现在把算法抽出来,然后把判断用什么算法的逻辑也抽出来,职责更加单一明显,维护更加方便。
- 更符合开闭原则,当需要加新算法或需要修改逻辑时,只要加新的算法类和修改Context就好,不要改客户端。
缺点
- 增加开发量。
- 有可能会造成很多的策略类。
适用场景
- 几个类的主要逻辑相同,只在部分逻辑的算法和行为上稍有区别的情况。
- 有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。
相关推荐
JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式JAVA常用设计模式
### 常用设计模式及Java程序设计 #### 设计模式概述 设计模式是一种软件设计领域中的通用解决方案,用于描述解决常见设计问题的最佳实践。它不仅有助于提高代码的复用性和可读性,还能增强软件架构的灵活性和扩展...
这个压缩包文件"23常用设计模式的UML"提供了23个经典设计模式的统一建模语言(UML)表示,这对于理解和应用这些模式至关重要。 首先,我们要了解UML是一种标准化的图形表示法,用于系统分析、设计和建模。它通过...
以下是关于标题和描述中提到的Java常用设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂方法实现。双检锁(Double-Check Locking)...
这篇博客“九种常用设计模式的应用!”探讨了九种常见的设计模式,并结合实际开发场景阐述了它们的应用。以下是对这些设计模式的详细介绍: 1. **单例模式**(Singleton):保证一个类只有一个实例,并提供一个全局...
在这个Java常用设计模式的文档中,我们将深入探讨以下几种模式:单例模式、工厂模式、策略模式以及观察者模式。 **单例模式**是一种限制类实例化次数的模式,确保一个类只有一个实例,并提供一个全局访问点。在Java...
以下是对Java中常用设计模式的详细解释: 1. **单例模式**:单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置管理、线程池或者数据库连接池等场景。实现方式有懒汉式(线程不安全)、...
这里提到的"9种常用设计模式收集"涵盖了Java Web开发和Android开发中的一些核心设计原则,通过深入理解并应用这些模式,开发者可以提高代码的可读性、可维护性和可扩展性。 1. **单例模式**:单例模式确保一个类...
### Java常用设计模式详解 #### 一、设计模式概述 设计模式是一种在特定情况下解决软件设计问题的经验总结,它能够帮助开发者在面对相似的问题时快速找到解决方案。设计模式大致可以分为三大类:创建型模式、结构...
java常用的设计模式一个简单总结,如工厂模式、单例模式、代理模式等等。(楼主也是未入门的菜鸟,如有错误请及时联系楼主更正,谢谢!)
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
设计模式是软件工程中经过长期实践总结出的通用解决方案,它们描述了在特定情况下如何解决...通过阅读和学习提供的"常用设计模式java实现"压缩包中的例子,可以更好地理解和实践这些设计模式,从而提升Java编程技能。
本文主要介绍Java中的几种常用设计模式及其应用。 首先,设计模式可以根据它们的用途被分类为三大类:创建模式、结构模式和行为模式。 创建模式主要涉及对象的创建,包括工厂方法模式、抽象工厂模式、单例模式、...
### 常用设计模式及Java程序 #### 设计模式概览 设计模式是一种软件工程的概念,用于描述解决常见设计问题的最佳实践。本书《常用设计模式及Java程序》旨在为读者提供一系列经过验证的设计模式及其在Java编程语言...
设计模式是软件开发中的一种重要思想,用于解决常见的设计问题并提供可复用的解决方案。在Java中,设计模式尤其重要,因为它们可以帮助我们编写出更灵活、可维护和易于扩展的代码。以下是对给定文件中提到的几种设计...
设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题,提供了一套可重用的解决方案。这些模式都是经验丰富的开发者在实践中总结出来的,它们描述了在特定上下文中,如何创建、组合和使用对象以...
该文件里面包含JAVA开发常用的设计模式,通过举例、分析、代码示意的方式让读者很容易理解