说下前言:在struts框架中的struts2-core包下有个struts-default.xml。打开后发现里面有封装的很多的对象,其中有个对象工厂去管理如下图所示:
我们由上图的对象工厂来深入理解下什么是对象工厂,它具体在底层是怎么实现的呢
假设现在有个员工的需求。我们在service中去创建dao一般情况下是这样
这样创建一般都会显得很low,我们知道与持久层打交道有jdbc,mybatis,hibernate但是我们换一种方式就需要修改daoimpl类这样会显得很麻烦。并出现硬编码问题。假设我们现在定义一个DaoFactory类(使用单例模式去创建)专门去创建dao 如下:
这 样看起来还是显得很low只是把new对象放在工厂中,用户看不到而已。接下来我们使用反射以及配置文件去实现这个类代码如下:
现在虽然比着上面的高级一点,但是代码还是有点问题。用户在创建的时候还是需要强转的。这样显得并不完美,我们应该把用户需要强转的这一环节去交给工厂去完成,而用户只需要去调用即可,不要忘了最初的规范。进而我们进入了泛型:代码如下:
上述代码虽然解决了强转问题,但是又引入了新的问题,假设现在用户随便使用类型进行接收(int类型),那么代码就会报错。因为我们传的是Employee类型的对象,不能使用int去接收。进而我们在思考,通过参数去加控制对象进而更加的安全,不会出现这个问题,代码如下:
看上述代码,虽然解决了用户接收错误的问题但是新的问题又出现了,如果使用前后都是int类型呢?要解决这个问题,我们应该在getDao方法中进行判断代码如下:
上述问题解决了,但是新的问题又出现了。现在bean.properties中只是单一的键值对,是单例模式,若是多例呢?这时候我们应该想到xml文件。
总结:这就是框架底层的工厂对象模式。进而去引出spring这个完美的框架体系。还是那句话,代码不是主要的。重要的是思想,是这个模式带给我们的思考方式,一步一步去完善我们需要的,这才是我们所追求的最高境界。永远的站在比代码更高的层次去想问题,会走的更远!