Java如何实现Singleton模式?

当我们只允许在应用程序内部创建类的单个实例时,使用Singleton模式。这种模式通过保护类创建过程来确保类只有一个实例,这可以通过使用private访问修饰符定义类构造函数来完成。

为了获得单例的实例,我们提供了一个getInstance()方法,这将是获取单例类实例的唯一方法。

package org.nhooo.example.pattern.factory;

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        return instance;
    }

    public void doSomething() {
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("Clone is not allowed.");
    }
}

当我们要实现单例时,需要遵循一些规则。

  • 从上面的代码中,我们可以看到单例具有一个静态变量以使其成为唯一实例。

  • 我们需要将类构造函数设置为私有访问修饰符。这样,我们将不允许任何其他类创建此单例的实例,因为它们无法访问构造函数。

  • 因为没有其他类可以实例化此单例,我们如何使用它?答案是单例应该通过提供一些返回实例的方法为其用户提供服务,例如getInstance()。

  • 在多线程应用程序中使用单例时,我们需要确保实例创建过程不会产生一个以上的实例,因此我们添加了一个synchronized关键字来保护多个线程同时访问此方法。

  • 还建议重写类的clone()方法java.lang.Object并抛出,CloneNotSupportedException以使无法通过克隆单例对象来创建另一个实例。

这就是我们使用单例类的方式。

package org.nhooo.example.pattern.factory;

public class SingletonDemo {
    public static void main(String[] args) throws Exception {
        // 获取Singleton类的实例,然后调用
        // doSomething方法。
        Singleton singleton = Singleton.getInstance();
        singleton.doSomething();
    }
}