工厂方法模式实现单例

首先要创建一个单例实例,这个实例的无参构造是私有的,防止外部使用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

打印两次的结果相同,说明使用的是同一个对象。

猜你喜欢

转载自a511480568.iteye.com/blog/2277330
今日推荐