技术解决方案

ideahub单例设计模式

添加时间:2022-02-08 19:33:52
评分:
浏览:

ideahub单例是四人组设计模式的一部分,它被归类为创建设计模式。在本文中,我们将深入研究 Singleton 模式的用法。就建模而言,它是最简单的设计模式之一,但另一方面,就使用复杂性而言,这是最具争议的模式之一。


单例模式是一种限制类实例化其多个对象的设计模式。它只不过是一种定义类的方式。类的定义方式是在程序或项目的完整执行中只创建一个类的实例。它用于只需要一个类的单个实例来控制整个执行过程中的操作。一个单例类在任何情况下都不应该有多个实例并且不惜任何代价。单例类用于日志记录、驱动程序对象、缓存和线程池、数据库连接。


单例设计模式

单例类的实现


单例类的实现应具有以下属性:


它应该只有一个实例: 这是通过从类中提供类的实例来完成的。应防止外部类或子类创建实例。这是通过在 java 中将构造函数设为私有来完成的,这样任何类都无法访问构造函数,因此无法实例化它。

实例应该是全局可访问的: 单例类的实例应该是全局可访问的,以便每个类都可以使用它。在 Java 中,它是通过公开实例的访问说明符来完成的。


//A singleton class should have public visibility

//so that complete application can use

public class GFG {

    

  //static instance of class globally accessible

  public static GFG instance = new GFG();

  private GFG() {

    // private constructor so that class

    //cannot be instantiated from outside

    //this class

  }

}

详细文章:Java中单例设计模式的实现


Singleton的初始化类型


单例类可以通过两种方法实例化:

早期初始化:在此方法中,无论是否使用,都会初始化类。这种方法的主要优点是简单。您在类加载时启动类。它的缺点是无论是否使用类,它总是被初始化。

延迟初始化:在此方法中,仅在需要时才初始化类。当您不需要它时,它可以使您免于实例化该类。一般我们在创建单例类的时候都会用到惰性初始化。

单例类的例子


java.lang.Runtime : Java 在其 lang 包中提供了一个 Runtime 类,它本质上是单例的。每个 Java 应用程序都有一个 Runtime 类的实例,它允许应用程序与运行应用程序的环境进行交互。当前运行时可以通过 getRuntime() 方法获得。

应用程序无法实例化此类,因此无法为此类创建多个对象。因此 Runtime 是一个单例类。

java.awt.Desktop : Desktop 类允许 Java 应用程序启动在本机桌面上注册的关联应用程序以处理 URI 或文件。

支持的操作包括:

启动用户默认浏览器以显示指定的 URI;

使用可选的 mailto URI 启动用户默认邮件客户端;

启动已注册的应用程序以打开、编辑或打印指定文件。

该类提供了与这些操作对应的方法。这些方法查找在当前平台上注册的关联应用程序,并启动它以处理 URI 或文件。如果没有关联的应用程序或者关联的应用程序启动失败,则抛出异常。

每个操作都是由 Desktop.Action 类表示的操作类型。

这个类也不能从应用程序中实例化。因此它也是一个单例类。


单例类的应用


单例模式有很多应用,如缓存、数据库连接、驱动程序、日志记录。其中一些主要是:-


硬件接口访问:使用单例取决于需求。单例类也用于防止类的并发访问。在需要外部硬件资源使用限制的情况下,实际上可以使用单例,例如可以将打印假脱机程序设为单例的硬件打印机,以避免多个并发访问和造成死锁。

Logger :单例类用于日志文件生成。日志文件由记录器类对象创建。假设一个应用程序,其中日志实用程序必须根据从用户收到的消息生成一个日志文件。如果有多个客户端应用程序使用此日志记录实用程序类,他们可能会创建此类的多个实例,并且在并发访问同一记录器文件期间可能会导致问题。我们可以将 logger 实用程序类用作单例并提供全局参考点,以便每个用户都可以使用此实用程序,并且没有 2 个用户同时访问它。

配置文件:这是单例模式的另一个潜在候选者,因为它具有性能优势,因为它可以防止多个用户重复访问和读取配置文件或属性文件。它创建了一个配置文件实例,可以同时被多个调用访问,因为它将提供加载到内存对象中的静态配置数据。应用程序仅第一次从配置文件中读取,然后从第二次调用开始,客户端应用程序从内存中的对象中读取数据。

缓存:我们可以将缓存用作单例对象,因为它可以具有全局引用点,并且对于将来对缓存对象的所有调用,客户端应用程序将使用内存中的对象。

要点


单例类只能有一个实例,并且该实例应该是全局可访问的。

java.lang.Runtime 和 java.awt.Desktop 是 JVM 提供的 2 个单例类。

单例设计模式是一种创建型设计模式。

应防止外部类创建单例类的实例。


来源: