📜  Java中的私有构造函数和Singleton类(1)

📅  最后修改于: 2023-12-03 15:02:03.008000             🧑  作者: Mango

Java中的私有构造函数和Singleton类

在Java中,可以通过私有构造函数和Singleton类设计模式来实现单例模式。单例模式是一种设计模式,其目的是保证类在任何时刻都只有一个实例存在,并提供全局访问点。

私有构造函数

在Java中,可以通过将构造函数设置为私有访问修饰符来防止类的实例化,从而实现单例模式。私有构造函数只能被类内部的其他方法调用,从而限制了外部对于类的实例化。

下面是私有构造函数的示例代码:

public class Singleton {
    private Singleton() {
        // private constructor
    }

    // static method to get the Singleton instance
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // SingletonHolder class
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

在上面的示例中,私有构造函数被声明为private。这意味着它只能被Singleton类内部的其他方法调用。

Singleton类

Singleton类是一种可以防止类在任何时刻都只有一个实例存在的设计模式。使用Singleton类设计模式可以确保在运行时只有一个类的实例存在,并提供全局访问点来访问该实例。

下面是Singleton类的示例代码:

public class Singleton {
    private static Singleton INSTANCE = null;

    private Singleton() {
        // private constructor
    }

    // static method to get the Singleton instance
    public static Singleton getInstance() {
        if(INSTANCE == null) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}

在上面的示例中,Singleton类只能被实例化一次。在第一次调用getInstance()方法时,会创建一个新的实例。随后的调用将返回先前创建的实例。

双重锁定Singleton类

在单线程程序中,上述示例代码可以正常工作。但在多线程程序中,该代码可能会导致许多实例被实例化。为了防止这种情况发生,可以使用双重锁定方式来保证Singleton类在任何时刻都只被实例化一次。

下面是双重锁定Singleton类的示例代码:

public class Singleton {
    private static volatile Singleton INSTANCE = null;

    private Singleton() {
        // private constructor
    }

    // static method to get the Singleton instance
    public static Singleton getInstance() {
        if(INSTANCE == null) {
            synchronized (Singleton.class) {
                if(INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

在上面的示例中,getInstance()方法中的synchronized块会确保只有一个线程可以访问该方法。在第一次调用该方法时,会创建一个新的实例。随后的调用将返回先前创建的实例。

总结

在Java中,可以使用私有构造函数和Singleton类设计模式来实现单例模式。通过将构造函数设置为私有访问修饰符,可以防止类的实例化。使用Singleton类设计模式可以确保在运行时只有一个类的实例存在,并提供全局访问点来访问该实例。在多线程程序中,使用双重锁定方式可以保证Singleton类在任何时刻都只被实例化一次。