通过一个小的场景,来理解一下工厂模式的使用情况。
数据库有很多种,常用的有mysql和oracle,我们的代码如果想要与数据库通讯,就必须使用对应的数据库驱动包。现在有这样一个场景,假设我的程序连接了两个数据库,我要根据用户的请求来查询不同的数据库,怎么办。
拿到这个需求 。
首先我们来看一下普通玩家的玩法:
普通玩家
要满足要求很简单啊,写两个类,一个连接mysql,一个连接oracle不就完了。然后在调用的时候根据参数选择需要连接哪个数据库就完了,打完收工~ 看起来没什么毛病啊~确实没什么毛病
好了,你真按这个思路写的话,打完肯定就下岗了。其实写代码最大的问题不在于写完的时候你觉得你多么厉害,多么有效率,而是一旦要修改的时候,才能发现你到底厉不厉害。
假设我要新加一个数据库postgresql,我首先要在被调用方新增一个类,实现连接数据库的方法,然后在调用方还要改代码!main方法就是调用方,需要再加一个else if 的判断,判断是否postgresql。
我们写代码的原则是修改要对调用者透明,就是说你改了代码,不要让调用你功能的地方都一起改,如果你一改代码,大家伙都要加班陪你改,你想想你的下场是什么。
我们再来看看高端玩家怎么做:
高端玩家
看看高端玩家的做法,首先定义一个连接的接口,然后具体的mysql连接类和oracle连接类实现接口。
DataBaseFactory这个类是关键,他将对象的调用和创建分离开来,自己专门的职责就是创建对象,而调用者只管调用。当调用者需要mysql的时候,创建mysql的连接类返回,需要oracle的时候,创建oracle的连接类返回。
在工厂类中,获取连接对象方法的返回值就是定义接口的原因,这样不管具体需要返回什么类型的数据库,只要是个数据库的连接就可以。
再看main方法调用的时候,不管是mysql还是oracle,都直接用接口对象调用方法,不用具体的类去创建对象,这样使程序的灵活性大大增加。
灵活性体现在,一旦需要增加新的数据连接,main方法里一行代码都不需要改变,只需要将参数修改成postgresql就完了。具体需要修改的只是功能的提供方,也就是新增一个postgresql去实现connection接口,然后在DataBaseFactory里面加一个判断即可。
有同学肯定很困扰,你这样搞一大堆,该改的时候还不是要改,有什么区别?
区别就在于,普通玩家需要调用方一起改,要知道一个系统大了,可是不止一个地方有调用的,而高端玩家只需要自己改,调用方不用改,这就是区别。
其实这就是简单工厂模式,工厂就是用来批量创建对象的,不需要调用者自己创建,而是提供者根据调用者的需求来创建,这样设计的好处是,就算我要改功能,对于调用方来说,他是可以完全不关心甚至不用知道。