设计模式之抽象工厂模式
来源:互联网 发布:srt字幕合成软件 编辑:程序博客网 时间:2024/06/07 22:26
在前面两篇博文中,我记录了简单工厂模式和工厂方法模式这两种设计模式,这两种设计模式用我自己的理解就是:
简单工厂模式用一个工厂类实现了生产多个不同产品的功能,只要为工厂类提供不同的参数,就可以根据这个参数返回不同的产品,比如加减乘除这四种运算,就是四个不同的产品类,可以为他们抽象出一个共同的基类(或接口),该类(或接口)中定义了这四个类共有的方法getResult(),和运算需要的变量number1、number2,简单工厂模式就是提供一个OperationFactory类,该工厂类提供了一个生产不同运算类的方法createOperator(),通过传不同的参数,返回不同的运算类。
简单工厂类的应用虽然很广,但是它违反了设计模式中的一个基本原则:开放封闭原则,即设计模式要满足面向扩展开放,面向修改封闭。但是当我们需要增加一个新的运算类时,很明显,工厂类就需要做修改了,createOperator()方法需要根据传入的参数,生成新的运算类。
为了让简单工厂模式能不违反开放封闭原则,工厂方法模式就产生了。
工厂方法模式将工厂也抽象出来,而不是像简单工厂模式那样只有一个工厂类,工厂方法模式通过抽象出一个IFactory,将需要生产的不同产品,都为其写不同的工厂类,这些工厂类的基类都是IFactory,这样,如果我们再要增加新的运算类时,就不用修改已有的工厂类了,而是写一个新的工厂类,用于生产这个新的运算类。
工厂方法模式虽然避免了简单工厂模式违反的开放封闭原则,但是在某些情况下,还是有一定的局限,比如下面的例子:
数据库中有User表,包含ID和Name字段,针对User的操作,有插入User到数据库和从数据库取对应ID的User这两种,当我们的程序需要从SqlServer数据库切换到Access数据库时,怎么用合理的设计模式让代码能复用呢?如果用工厂方法模式,我们应该这么做:
1、将对User的操作抽象出来,设计接口IUser,其中包含两个方法的声明:insertUser(User user)、getUser(int id)
2、为SqlServer和Access分别编写不同的操作类SqlServerUser、AccessUser,且这两个操作类都实现了IUser接口,对User的插入和获取,我们可以使用IUser类来完成,而不必关心到底是哪种数据库了
3、抽象出一个工厂IFactory,包含方法createUser(),然后分别为SqlServerUser和AccessUser类编写对应的工厂类SqlServerFactory、AccessFactory,由这两个工厂类来生产第二步中的SqlServerUser类和AccessUser类
到这里基本上就完成了,抽象出来的IUser和IFactory,达到了代码的复用,而且使代码中对数据库的操作,可以不必关心到底是操纵的哪种数据库,上面的模式对应的UML类图如下:
但是,当我们的数据库中需要增加表的时候,该怎么办呢?如果有一张部门表Department,对部门的操作也有插入和获取这两种,这时候,我们可以在IFactory接口中去声明新的方法createDepartment(),由SqlServerFactory和AccessFactory去复写该方法并生产不同数据库对应的部门操作类,和User一样,对于Department,也要抽象出一个IDepartment接口,声明对Department操作的insert和get方法,这时候,上面的UML类图就变成如下的模式了:
这就是抽象工厂模式。
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之-抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- javascript一些纯对象操作记录
- notepad++运行网页文件
- 算法之-快速排序算法
- JavaScript获取项目路径
- IOCP的缓冲区
- 设计模式之抽象工厂模式
- VC++ Unable to register this add-in because its DllRegisterServer returns an error 解决方案
- Android中SQLite的意义及用法
- python_message的使用
- CPU占用率过高,如何调试
- Unity3D安卓打包参数配置与兼容性的关系分析
- tomcat
- Git的诞生
- Android内存泄漏就这样产生了