首页 > Java > java教程 > Java 中的单例类

Java 中的单例类

PHPz
发布: 2024-08-30 16:00:03
原创
911 人浏览过

单例类将一个类的对象创建限制为在java虚拟机中只能创建一个。它还有助于提供对象的全局访问点。这种设计模式常用于缓存、抽象工厂、日志记录、Prototype等,也用于java.awt.Desktop、java.lang.Runtime等核心java类中。在java.lang.Runtime中,Java提供了一个Runtime类,表示应用程序当前运行的运行时环境。这有助于连接应用程序和运行时环境。应该有一个对象,因为 JRE 是唯一的。在 java.awt.Desktop 中,Desktop 类允许应用程序使用用户的默认浏览器、邮件客户端等启动 URI 或文件。同样,该类必须只有一个实例。

单例类在 Java 中如何工作?

单例类可以通过两种方式创建。

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

  1. 将构造函数设置为私有,以限制对象的创建。
  2. 创建一个静态方法来获取对象的实例,这样您就可以只在类内部处理对象的创建。

现在让我们看看Singleton类的类UML(统一建模语言)图。

Java 中的单例类

在类UML图中,第一个分区代表类的名称,第二个分区代表属性,第三个分区代表方法。另外,+表示公共属性或方法,-表示私有属性或方法。例如,在我们的 Singleton 类 UML 图中,类名为 Singleton,并且它有一个 main 方法。 main 方法、 getInstance 方法和sampleMethod 是上图中唯一公开的方法。作为我们实现的一部分,构造函数和实例属性被设置为私有。这个公共 Main 方法请求实例,然后 getInstance 将其返回给 main 方法。

基于实例化,普通Java类和Singleton类之间的唯一区别是我们将在Java类中使用构造函数,而在Singleton中我们将使用getInstance()方法。

Singleton的设计模式有两种形式。

  • 延迟实例化: 需要时创建实例
  • 早期实例化: 在加载时创建实例。

1。惰性实例化

在延迟实例化中,类实例在需要时创建。它是在 Synchronized 方法或块中创建的,以避免多线程环境中可能发生的竞争条件。

2。早期实例化

在早期实例化中,实例是在加载时创建的。尽管这是最简单的方法,但它有一个缺点,即实例创建与是否访问无关。

下一节将解释延迟实例化和早期实例化的示例。

Java中Singleton类的实现

如上所述,单例类可以在早期实例化或延迟实例化中创建。

惰性实例化

以下是实现延迟实例化的步骤。

1.将构造函数设置为私有。

例如,我们正在创建一个类 LazyClass。构造函数如下所示。

private LazyClass ()
{
}
登录后复制

2.为创建的类创建一个私有静态实例。

private static LazyClass instance;
登录后复制

3.创建一个静态同步方法来获取创建的类实例。

public static synchronized LazyClass getInstance()
{
}
登录后复制

4.在 getInstance() 方法中,首先检查是否存在任何实例。如果没有找到,则创建一个。否则返回实例。

if(instance == null)
{
instance = new LazyClass ();
}
return instance;
登录后复制

现在,让我们使用示例代码来研究它。

//Java Program for Lazy Instantiation
public class LazyClass {
private static LazyClass instance;
//set the constructor as private
private LazyClass () {}
//Checks whether an instance is already in the getInstance method
public static synchronized LazyClass getInstance() {
//if instance is not present already, create a new one
if(instance == null) {
instance = new LazyClass ();
}
// if an instance is present, then return it
return instance;
}
//Sample method that is protected from more than one object creation
public void sampleMethod( ) {
System.out.println("sampleMethod for lazy singleton");
}
public static void main(String[] args) {
LazyClass temp=LazyClass.getInstance();
temp.sampleMethod();
}
}
登录后复制

输出:

Java 中的单例类

这里,不是在加载时创建实例,而是在同步块内创建实例。为了更好地理解,还给出了一个示例方法,它可以防止多个对象创建。

早期实例化

现在让我们看看早期实例化的步骤。它与延迟实例化类似,只是它不使用任何同步方法或块。

1.将构造函数设置为私有。

例如,我们正在创建一个类,EarlyClass。构造函数如下所示。

private EarlyClass () ()
{
}
登录后复制

2.为创建的类创建一个私有静态实例。

private static EarlyClass <em>ins</em>= new EarlyClass();
登录后复制

3.创建一个静态方法来获取创建的类实例。

public static EarlyClass getInstance()
{
}
登录后复制

以下是早期实例化的示例代码。

//Java Program for Early Instantiation
public class EarlyClass {
//Create an instance of the class at load time
private static EarlyClass <em>ins</em>= new EarlyClass();
//set the constructor as private
private EarlyClass () {}
//A static method to get the instance
public static EarlyClass getInstance() {
return ins;
}
//A sample method that is protected from more than one object creation
public void sampleMethod() {
System.out.println("sampleMethod for Early singleton");
}
//Main method
public static void main(String[] args) {
EarlyClass tmp = getInstance();
tmp.sampleMethod();
}
}
登录后复制

输出:

Java 中的单例类

在上面的程序中,在加载时创建了一个实例,并使用 getInstance() 方法返回它。此外,作为单例实例化的一部分,构造函数被设置为私有。

节省内存是使用它的主要优点,因为对象可以被重用,而不是一次又一次地创建。

结论

在本文档中,我们通过类 UML 图、算法和示例代码介绍了单例类如何工作。当我们只需要一个类的一个对象和该对象的全局访问点时,可以使用单例类。可以根据需要使用早期实例化和延迟实例化两种形式。

以上是Java 中的单例类的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板