单例类将一个类的对象创建限制为在java虚拟机中只能创建一个。它还有助于提供对象的全局访问点。这种设计模式常用于缓存、抽象工厂、日志记录、Prototype等,也用于java.awt.Desktop、java.lang.Runtime等核心java类中。在java.lang.Runtime中,Java提供了一个Runtime类,表示应用程序当前运行的运行时环境。这有助于连接应用程序和运行时环境。应该有一个对象,因为 JRE 是唯一的。在 java.awt.Desktop 中,Desktop 类允许应用程序使用用户的默认浏览器、邮件客户端等启动 URI 或文件。同样,该类必须只有一个实例。
单例类可以通过两种方式创建。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
现在让我们看看Singleton类的类UML(统一建模语言)图。
在类UML图中,第一个分区代表类的名称,第二个分区代表属性,第三个分区代表方法。另外,+表示公共属性或方法,-表示私有属性或方法。例如,在我们的 Singleton 类 UML 图中,类名为 Singleton,并且它有一个 main 方法。 main 方法、 getInstance 方法和sampleMethod 是上图中唯一公开的方法。作为我们实现的一部分,构造函数和实例属性被设置为私有。这个公共 Main 方法请求实例,然后 getInstance 将其返回给 main 方法。
基于实例化,普通Java类和Singleton类之间的唯一区别是我们将在Java类中使用构造函数,而在Singleton中我们将使用getInstance()方法。
Singleton的设计模式有两种形式。
1。惰性实例化
在延迟实例化中,类实例在需要时创建。它是在 Synchronized 方法或块中创建的,以避免多线程环境中可能发生的竞争条件。
2。早期实例化
在早期实例化中,实例是在加载时创建的。尽管这是最简单的方法,但它有一个缺点,即实例创建与是否访问无关。
下一节将解释延迟实例化和早期实例化的示例。
如上所述,单例类可以在早期实例化或延迟实例化中创建。
以下是实现延迟实例化的步骤。
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(); } }
输出:
这里,不是在加载时创建实例,而是在同步块内创建实例。为了更好地理解,还给出了一个示例方法,它可以防止多个对象创建。
现在让我们看看早期实例化的步骤。它与延迟实例化类似,只是它不使用任何同步方法或块。
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(); } }
输出:
在上面的程序中,在加载时创建了一个实例,并使用 getInstance() 方法返回它。此外,作为单例实例化的一部分,构造函数被设置为私有。
节省内存是使用它的主要优点,因为对象可以被重用,而不是一次又一次地创建。
在本文档中,我们通过类 UML 图、算法和示例代码介绍了单例类如何工作。当我们只需要一个类的一个对象和该对象的全局访问点时,可以使用单例类。可以根据需要使用早期实例化和延迟实例化两种形式。
以上是Java 中的单例类的详细内容。更多信息请关注PHP中文网其他相关文章!