首先要创建一个单例实例,这个实例的无参构造是私有的,防止外部使用new关键字创建对象
public class Singleton { private Singleton() { } public void doSomething() { System.out.println("单例工厂"); } }
再次创建一个单例工厂,创建对象要在static代码块中,不可在方法getSingleton()中,如果在该方法中,每次调用都会产生一个新的对象,这就违背了单例的规则。
public class SingletonFactory { private static Singleton singleton; static { try { Class clazz = Class.forName(Singleton.class.getName()); Constructor constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); singleton = (Singleton) constructor.newInstance(); } catch (ClassNotFoundException e) { } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Singleton getSingleton() { return singleton; } }
客户端代码:
public class SingletonFactoryTest { public static void main(String[] args) { Singleton singleton = SingletonFactory.getSingleton(); Singleton singleton2 = SingletonFactory.getSingleton(); System.out.println(singleton); System.out.println(singleton2); } }
打印结果:
com.za.java.factory.Singleton@3c0f3387
com.za.java.factory.Singleton@3c0f3387
打印两次的结果相同,说明使用的是同一个对象。