前言
前一篇博文中介绍了简单工厂模式,这里再介绍一下工厂方法模式。与简单工厂很像,那么两者的区别是什么呢?在这篇博文中,首先会简单介绍一下工厂方法的使用方法,并对工厂方法模式进行简单的小结。最后,将结合具体的例子对比简单工厂模式与工厂方法模式,并对两者的使用场景做一个小小的归纳。
背景: 某公司开发了一个a软件,数据库使用的是sqlserver。后由于客户要求需要使用oracle数据库,原来的数据要迁移到oracle中,在迁移的过程中遇到很多问题,比如语法错误,关键字滥用,函数不支持等问题。请设计一组程序,实现数据的无缝迁移
问题背景与工厂方法一样,主要是为了便于对两者进行比较。ok,为了对工厂方法有一个更好的理解,请看下面的结构图:
于是,我们根据上面的结构图可以写出如下的代码:
测试结果:
<code>使用oracle添加用户</code>
<code>使用oracle通过id找到用户</code>
ok,通过上面的程序,我们来回顾一下工厂方法的定义:
工厂方法定义一个用于创建对象的接口,让子类去决定实例化哪个对象。创建对象延迟到子类中
把创建对象延迟到子类中,由子类决定创建何种类型的实例
当需要增加功能时,只需要直接修改客户端而保持其他代码不变就可以实现
回到上一篇博文中,假设有三个客户需要使用oracle对象,那么我们在代码中这么实现的:
好,这样写并没有什么问题,假如这三个用户觉得oracle不好用,要改用sqlserver对象,怎么办?简单,直接把上面的代码中的oracle改为sqlserver不久行了嘛,所以修改之后的代码这样的:
代码改好了,很简单,有木有,确实。但是加入不是三个用户而是一亿个用户呢?难道要改一亿次,明显不太现实(可能有人说,一亿算个啥,用ctrl+h直接一替换不久完事了吗。我们在讨论设计模式,不带这么玩的哈,这不科学!)
而我们使用工厂方法模式只需要修改上面测试方法中的工厂对象就可以
通过这个例子,可以发现简单工厂模式违背了<code>对外扩展开放,对内修改关闭的原则</code>,因为当需要增加mysql对象的时候,需要在工厂方法模式中添加switch的语句分支的判断,而在工厂方法模式中,只需要创建一个mysql对象工厂类(需要实现idbobjectfactory接口)就可以了,代码比较简单就不附上代码了。