工厂模式优势

  1. 工厂模式具有良好的封装性,代码结构清晰,也有利于扩展。在增加产品类的情况下,只需要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。
  2. 工厂模式可以屏蔽产品类。这一点非常重要,产品类的实现如何变化,调用者都不用关系,只需要关心产品的接口,只要接口保持不变,系统的上层模块就不需要发生变化。
  3. 工厂模式是典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心。

通过工厂模式创建单例

Singleton.java

package com.niuxuewei.singleton;

public class Singleton {

    /**
     * 私有构造函数
     * 不能通过new Singleton创建
     */
    private Singleton() {}

    /**
     * 业务逻辑
     */
    public void doSomething() {
        System.out.println("do something...");
    }

}

SingletonFactory.java

package com.niuxuewei.singleton;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 通过工厂方法创建单例对象
 */
@SuppressWarnings("all")
public class SingletonFactory {

    private static Singleton instance;

    static {
        try {
            Class clazz = Class.forName(Singleton.class.getName());
            // 获取无参构造函数
            Constructor constructor = clazz.getDeclaredConstructor();
            // 设置无参构造方法可访问
            constructor.setAccessible(true);
            // 产生一个实例对象
            instance = (Singleton)constructor.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    public static Singleton getInstance() {
        return instance;
    }

}

SingletonMain.java

package com.niuxuewei.singleton;

public class SingletonMain {

    public static void main(String[] args) {
        Singleton singleton1 = SingletonFactory.getInstance();
        Singleton singleton2 = SingletonFactory.getInstance();
        singleton1.doSomething();
        singleton2.doSomething();
        if (singleton1 == singleton2) {
            System.out.println("singleton instance created successful!");
        }
    }

}

REFERENCES