📜  Java的单例类

📅  最后修改于: 2021-09-10 02:52:24             🧑  作者: Mango

在面向对象编程中,单例类是一次只能有一个对象(类的一个实例)的类。
第一次之后,如果我们尝试实例化 Singleton 类,新变量也指向创建的第一个实例。因此,无论我们通过任何实例对类内的任何变量进行任何修改,它都会影响创建的单个实例的变量,并且如果我们通过定义的该类类型的任何变量访问该变量,则该变量是可见的。
设计一个单例类:

  1. 将构造函数设为私有。
  2. 编写一个静态方法,该方法具有此单例类的返回类型对象。在这里,使用延迟初始化的概念来编写这个静态方法。

普通类与单例类普通类和单例类在实例化方面的区别在于,对于普通类,我们使用构造函数,而对于单例类,我们使用 getInstance() 方法(示例代码:I)。通常,为了避免混淆,我们也可以在定义此方法时使用类名作为方法名(示例代码:II)。

使用 getInstance() 方法实现 Singleton 类

// Java program implementing Singleton class
// with getInstance() method
class Singleton
{
    // static variable single_instance of type Singleton
    private static Singleton single_instance = null;
  
    // variable of type String
    public String s;
  
    // private constructor restricted to this class itself
    private Singleton()
    {
        s = "Hello I am a string part of Singleton class";
    }
  
    // static method to create instance of Singleton class
    public static Singleton getInstance()
    {
        if (single_instance == null)
            single_instance = new Singleton();
  
        return single_instance;
    }
}
  
// Driver Class
class Main
{
    public static void main(String args[])
    {
        // instantiating Singleton class with variable x
        Singleton x = Singleton.getInstance();
  
        // instantiating Singleton class with variable y
        Singleton y = Singleton.getInstance();
  
        // instantiating Singleton class with variable z
        Singleton z = Singleton.getInstance();
  
        // changing variable of instance x
        x.s = (x.s).toUpperCase();
  
        System.out.println("String from x is " + x.s);
        System.out.println("String from y is " + y.s);
        System.out.println("String from z is " + z.s);
        System.out.println("\n");
  
        // changing variable of instance z
        z.s = (z.s).toLowerCase();
  
        System.out.println("String from x is " + x.s);
        System.out.println("String from y is " + y.s);
        System.out.println("String from z is " + z.s);
    }
}

输出:

String from x is HELLO I AM A STRING PART OF SINGLETON CLASS
String from y is HELLO I AM A STRING PART OF SINGLETON CLASS
String from z is HELLO I AM A STRING PART OF SINGLETON CLASS


String from x is hello i am a string part of singleton class
String from y is hello i am a string part of singleton class
String from z is hello i am a string part of singleton class

单例类
说明:在 Singleton 类中,当我们第一次调用 getInstance() 方法时,它会创建一个名为 single_instance 的类的对象并将其返回给变量。由于 single_instance 是静态的,因此它从 null 更改为某个对象。下一次,如果我们尝试调用 getInstance() 方法,由于 single_instance 不为 null,它将返回给变量,而不是再次实例化 Singleton 类。这部分由 if 条件完成。

在主类中,我们通过调用静态方法 getInstance() 实例化具有 3 个对象 x、y、z 的单例类。但实际上在创建对象 x 之后,变量 y 和 z 指向对象 x,如图所示。因此,如果我们更改对象 x 的变量,那么在我们访问对象 y 和 z 的变量时就会反映出来。同样,如果我们更改对象 z 的变量,则反映在我们访问对象 x 和 y 的变量时。

用方法名作为类名实现单例类

// Java program implementing Singleton class
// with method name as that of class
class Singleton
{
    // static variable single_instance of type Singleton
    private static Singleton single_instance=null;
  
    // variable of type String
    public String s;
  
    // private constructor restricted to this class itself
    private Singleton()
    {
        s = "Hello I am a string part of Singleton class";
    }
  
    // static method to create instance of Singleton class
    public static Singleton Singleton()
    {
        // To ensure only one instance is created
        if (single_instance == null)
        {
            single_instance = new Singleton();
        }
        return single_instance;
    }
}
  
// Driver Code
class Main
{
    public static void main(String args[])
    {
        // instantiating Singleton class with variable x
        Singleton x = Singleton.Singleton();
  
        // instantiating Singleton class with variable y
        Singleton y = Singleton.Singleton();
  
        // instantiating Singleton class with variable z
        Singleton z = Singleton.Singleton();
  
        // changing variable of instance x
        x.s = (x.s).toUpperCase();
  
        System.out.println("String from x is " + x.s);
        System.out.println("String from y is " + y.s);
        System.out.println("String from z is " + z.s);
        System.out.println("\n");
  
        // changing variable of instance x
        z.s = (z.s).toLowerCase();
  
        System.out.println("String from x is " + x.s);
        System.out.println("String from y is " + y.s);
        System.out.println("String from z is " + z.s);
    }
}

输出:

String from x is HELLO I AM A STRING PART OF SINGLETON CLASS
String from y is HELLO I AM A STRING PART OF SINGLETON CLASS
String from z is HELLO I AM A STRING PART OF SINGLETON CLASS


String from x is hello i am a string part of singleton class
String from y is hello i am a string part of singleton class
String from z is hello i am a string part of singleton class

说明:在 Singleton 类中,当我们第一次调用 Singleton() 方法时,它会创建一个名为 single_instance 的类 Singleton 的对象并将其返回给变量。由于 single_instance 是静态的,因此它从 null 更改为某个对象。下次如果我们尝试调用 Singleton() 方法,由于 single_instance 不为 null,它将返回给变量,而不是再次实例化 Singleton 类。