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(); } }