一开始了解了"简单工厂模式"之后,在关于为什么不直接实例对象,而是利用工厂类来实例对象产生了疑惑。
经过多种渠道的了解,我最后的观点是:这个工厂类不仅仅就只能有实例化对象这一个功能。举例来说,如果我要在实例化这个对象之前先读取某些配置,做各种各样的预备工作呢?比如下面的代码:
客户端类:
public classConsoleUser {public static voidmain(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 = newOperationPlus();
operation.num1= 5;
operation.num2= 2;//打印返回的计算结果
System.out.println(operation.getResult());
}
}
这就是你们说的,不用工厂,而是直接创建对象。假如要多次调用,那岂不是还要把这些繁琐的操作再做一遍?
如果把这些复杂繁琐的操作,提取到工厂的方法中,就会让编码得到很大的简化。
工厂类:
public classOperationFactory {public static Operation createOperation(charoperate) {
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= newOperationPlus();break;case '-':
operation= newOperationSub();break;case '/':
operation= newOperationDiv();break;case '*':
operation= newOperationMul();break;
}returnoperation;
}
}
客户端类(使用简单工厂方法):
public classConsoleUser {public static voidmain(String[] args) {//新建运算类
Operation operation;//工厂新建加法运算对象
operation = OperationFactory.createOperation('+');
operation.num1= 5;
operation.num2= 2;//对象调用方法返回信息
System.out.println(operation.getResult());
}
}
为了验证我的说法,特地去SessionFactoryImpl这个实现类中找到了opensession这个方法,代码如下:
SessionFactoryImpl中的源码:
privateSessionImpl openSession(
Connection connection,booleanautoClose,longtimestamp,
Interceptor sessionLocalInterceptor
) {return newSessionImpl(
connection,this,
autoClose,
timestamp,
sessionLocalInterceptor== null ?interceptor : sessionLocalInterceptor,
settings.getDefaultEntityMode(),
settings.isFlushBeforeCompletionEnabled(),
settings.isAutoCloseSessionEnabled(),
settings.getConnectionReleaseMode()
);
}
可能有些人会想,为啥不把这些复杂的操作放在加法运算类中。但是这样做,就违背了你一开始想要把具体的运算方法独立出来的初衷,代码耦合了。
比如我有个功能,就只需要加法这个对象而已,那不就尴尬了。