Java设计模式-单例模式
单例模式定义:它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
单例模式主要分为两大类:饿汉式和懒汉式,懒汉式又分为 单线程下的普通懒汉式,多线程下的双重校验锁、静态内部类、枚举。
单例模式的应用场景举例:
配置管理器:当应用程序需要读取和维护配置信息时,通常会使用单例模式来创建一个配置管理器。这保证了整个应用中只有一份配置数据副本,所有组件都引用同一个配置对象,从而避免了数据不一致的问题。
日志记录器:单例模式确保在整个应用程序中只有一个日志记录器实例。这样,所有的日志消息都可以统一地被这个实例处理。
单例模式确保在整个应用程序中只有一个日志记录器实例。这样,所有的日志消息都可以统一地被这个实例处理。例如,在 Java 中,java.util.logging.Logger类可以通过单例模式来实现。开发人员可以通过Logger.getLogger(\”name\”)方法获取一个唯一的日志记录器实例,所有对该实例的调用都可以保证日志的一致性,比如记录不同模块的信息到同一个日志文件中。
缓存:缓存数据通常需要全局唯一的实例来管理,以便在不同的地方访问和修改缓存时保持一致性。
单例模式可以用于实现缓存。一个单例的缓存实例可以存储经常访问的数据,在整个应用程序享。例如,一个 Web 应用中的用户权限缓存。当用户登录后,系统会查询数据库获取用户的权限信息并存储在单例缓存中。在用户后续的操作中,如访问某个需要权限验证的页面时,系统可以直接从这个单例缓存中获取用户权限信息,而不是每次都去查询数据库,大大提高了系统的响应速度。
数据库连接池:
数据库连接是一个昂贵的操作,频繁地创建和销毁连接会消耗大量的系统资源。因此,通常会使用连接池来管理数据库连接,而连接池本身往往是一个单例,以确保在整个应用中只有一个连接池实例,优化数据库访问性能。
线程池:
当处理大量并发任务时,为每个任务创建一个新线程会导致系统资源耗尽。线程池可以预先创建一组线程,任务到来时,将任务分配给线程池中的线程来执行,任务执行完毕后线程可以被复用。
单例模式适用于线程池的实现。整个应用程序通常只需要一个线程池来管理线程资源。例如,在 Java 的ExecutorService框架中,通过Executors.newFixedThreadPool(n)创建一个固定大小的线程池,这个线程池可以作为一个单例存在于应用程序中。所有需要异步执行的任务都可以提交给这个单例线程池,它可以有效地管理线程的创建、分配和回收,提高系统的并发处理能力。
单例模式的优点:
- 控制实例数量:确保一个类只有一个实例,避免了实例的重复创建,节省系统资源。
- 全局访问点:提供一个全局访问点,使得访问该实例变得简单。
- 延迟加载:某些实现方式(如懒汉式单例)可以实现延迟加载,即在需要时才创建实例,从而提高系统性能。
- 资源共享和节省:单例模式确保在整个应用程序中只有一个实例存在。对于一些资源密集型的对象,如数据库连接池、线程池等,这可以避免创建多个相同的对象,从而节省系统资源。
(一)单例模式-饿汉式java样例
(二)单例模式-单线程下-懒汉式java样例
(三)单例模式-多线程下-双重校验锁java样例
(四)单例模式-静态内部类
(五)单例模式-枚举
Java中常见的设计模式汇总?
设计模式是一套经过验证的设计方案和最佳实践,这些经验和方案主要就是用来解决软件设计过程中一些特定的问题。设计模式并不是代码本身,而是一种用来解决某种问题的抽象的解决方案,也就是说设计模式是在不同的语言、不同的场景中进行复用的。一般情况下我们可以将设计模式分为三类创建型模式、结构型模式和行为型模式。下面我们就分别介绍一下这三类设计模式中包含的内容。
创建型设计模式,主要涉及对象实例化的方式,是用来帮助系统独立对象的创建过程,如下所示,是常见的创建型的设计模式,其中比较常用的就是单例以及工厂设计模式。
单例模式(Singleton Pattern)
单例设计模式的使用,主要是为了确保在系统中一个类只有一个实例,并且通过这个单例类提供一个全局访问点。
工厂方法模式(Factory Method Pattern)
定义一个用于创建对象的接口,但由子类决定实例化哪一个类。
抽象工厂模式(Abstract Factory Pattern)
提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体类。
建造者模式(Builder Pattern)
将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
原型模式(Prototype Pattern)
原型模式主要就是通过对现有对象的复制操作来创建新的对象,而不是通过New这种方式通过实例化的方式来创建对象,可以保证创建对象都是同一个原型出品。
构建型设计模式,主要的作用就是帮助系统进行对象的组合,如下所示。
适配器模式(Adapter Pattern)
将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
桥接模式(Bridge Pattern)
桥接模式就是将对象的抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合模式(Composite Pattern)
将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象具有一致的处理方式。
装饰器模式(Decorator Pattern)
动态地给对象添加职责,将对象的职责附加到某个类上,通常在不修改原始类的情况下扩展功能。
外观模式(Facade Pattern)
为子系统中的一组接口提供一个一致的接口,使得子系统更易于使用。
享元模式(Flyweight Pattern)
通过共享尽可能多的对象来减少内存使用,适用于大量相似对象的场景。
代理模式(Proxy Pattern)
为其他对象提供一个代理,以控制对这个对象的访问,这个也是在开发过程中比较常用的一种设计模式
行为型设计模式,顾名思义,就是用来管理类或对象之间的交互,用来解决系统之间对象交互的管理,如下所示。
责任链模式(Chain of Responsibility Pattern)
通过将请求沿着一条链传递,让多个对象有机会处理该请求,避免请求的发送者和接收者耦合在一起。
命令模式(Command Pattern)
将请求封装为对象,从而使得可以用不同的请求来参数化其他对象,并支持请求的撤销和重做操作。
解释器模式(Interpreter Pattern)
解释器模式,为语言创建解释器,使得语言中的句子能够解释为抽象语法树。
迭代器模式(Iterator Pattern)
通过迭代器模式,提供一种顺序访问一个聚合对象中的各个元素的方法,而无需暴露该对象的内部表示。
中介者模式(Mediator Pattern)
定义一个中介对象来封装一组对象的交互方式,从而使这些对象之间不必显式地相互引用,达到松耦合的目的。
备忘录模式(Memento Pattern)
备忘录模式,是在不破坏封装操作的前提下,对对象内部状态进行捕捉,然后在后续需要的时候恢复对象的这个状态。
观察者模式(Observer Pattern)
定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。
状态模式(State Pattern)
状态模式,它允许了对象的内部状态发生变化的时候对其行为进行改变,有点类似于修改了它的类的操作方式。
策略模式(Strategy Pattern)
定义一系列算法,将每个算法封装起来,并使它们可以互换,算法的变化不会影响使用算法的客户。
模板方法模式(Template Method Pattern)
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法的某些步骤。
访问者模式(Visitor Pattern)
表示一个作用于某对象结构中的各元素的操作,使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
每种设计模式都有其适用的场景,例如如果你需要确保一个类只有一个实例,你可以使用单例模式。如果你需要为现有的类提供不同的接口,可以使用适配器模式等等。通过熟悉并掌握这些设计模式,可以在软件开发中更加灵活、优雅地解决各种复杂问题。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。