为什么用简单工厂模式,而不是直接实例化对象

时间:2019-03-13
本文章向大家介绍为什么用简单工厂模式,而不是直接实例化对象,主要包括为什么用简单工厂模式,而不是直接实例化对象使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一开始了解了"简单工厂模式"之后,在关于为什么不直接实例对象,而是利用工厂类来实例对象产生了疑惑。
经过多种渠道的了解,我最后的观点是:这个工厂类不仅仅就只能有实例化对象这一个功能。举例来说,如果我要在实例化这个对象之前先读取某些配置,做各种各样的预备工作呢?比如下面的代码:

客户端类:

public class ConsoleUser {
    public static void main(String[] args) {
        //新建运算类
        Operation operation;
        //各种乱七八糟的操作
        System.out.println("新建对象a");
        System.out.println("新建对象b");
        System.out.println("读取配置1");
        System.out.println("给对象a赋值");
        System.out.println("读取配置2");
        System.out.println("给对象b赋值");
        //创建加法类实例对象,并赋值给运算类
        operation = new OperationPlus();
        operation.num1 = 5;
        operation.num2 = 2;
        //打印返回的计算结果
        System.out.println(operation.getResult());
            }
}

这就是你们说的,不用工厂,而是直接创建对象。假如要多次调用,那岂不是还要把这些繁琐的操作再做一遍?
如果把这些复杂繁琐的操作,提取到工厂的方法中,就会让编码得到很大的简化。

工厂类:

public class OperationFactory {
    public static Operation createOperation(char operate) {
        Operation operation = null;
        switch (operate) {
        case '+':
            System.out.println("新建对象a");
            System.out.println("新建对象b");
            System.out.println("读取配置1");
            System.out.println("给对象a赋值");
            System.out.println("读取配置2");
            System.out.println("给对象b赋值");
            operation = new OperationPlus();
            break;
        case '-':
            operation = new OperationSub();
            break;
        case '/':
            operation = new OperationDiv();
            break;
        case '*':
            operation = new OperationMul();
            break;            
        }
        return operation;
    }
}


客户端类(使用简单工厂方法):

public class ConsoleUser {
    public static void main(String[] args) {
        //新建运算类
        Operation operation;
        //工厂新建加法运算对象
        operation = OperationFactory.createOperation('+');
        operation.num1 = 5;
        operation.num2 = 2;
        //对象调用方法返回信息
        System.out.println(operation.getResult());
    }
}

为了验证我的说法,特地去SessionFactoryImpl这个实现类中找到了opensession这个方法,代码如下:

SessionFactoryImpl中的源码:

    private SessionImpl openSession(
        Connection connection,
        boolean autoClose,
        long timestamp,
        Interceptor sessionLocalInterceptor
    ) {
        return new SessionImpl(
                connection,
                this,
                autoClose,
                timestamp,
                sessionLocalInterceptor == null ? interceptor : sessionLocalInterceptor,
                settings.getDefaultEntityMode(),
                settings.isFlushBeforeCompletionEnabled(),
                settings.isAutoCloseSessionEnabled(),
                settings.getConnectionReleaseMode()
            );
    }

可能有些人会想,为啥不把这些复杂的操作放在加法运算类中。但是这样做,就违背了你一开始想要把具体的运算方法独立出来的初衷,代码耦合了。
比如我有个功能,就只需要加法这个对象而已,那不就尴尬了。