博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一口一个设计模式--简单工厂VS工厂VS抽象工厂
阅读量:3979 次
发布时间:2019-05-24

本文共 1274 字,大约阅读时间需要 4 分钟。

   前几天一直在准备大学毕业,始终脱不开身,今天终于有时间进行设计模式的研究。咱们今天研究的话题是工厂家族三种设计模式的对比--简单工厂VS工厂VS抽象工厂。

   经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版。知道了它们之间的宏观关系,下面我带它们从一次次蜕变了解它们为什么是这样的关系。

   我们最原始的代码思维是把所有的实现都放在一个类中,功能虽然是实现了,但耦合性非常高,很不方便维护,好比活字印刷术之前的印刷,一个地方需要修改,则全部内容都需要推倒重来。

   简单工厂解决了上述问题,简单工厂中的工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,其思路如下图所示。但它有个致命的缺点:违反开放-封闭原则,比如当需要创建“开方类”的时候,需要修改“简单工厂类”中的方法。

    

    工厂模式弥补简单工厂的不足,将一个类的实例化延迟到其子类。工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,如果想要添加功能,只需修改客户端即可。比如添加“开方类”,只需在运算类下面添加一个“开方类”,在抽象工厂下面添加一个“开方工厂”即可,保证了开方-封闭原则,其思路如下图所示。但它的缺点是每加一个运算类,就需要加一个运算工厂的类,增加了额外的开发量。

     

      

   抽象工厂弥补了工厂模式的不足,抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。比如按工厂模式的思想,SqlserverUser类、AccessUser类、SqlDepartment类、AccessDepartment类需要四个工厂来创建,而抽象工厂对它们公共的部分进行了抽象,只需两个工厂就能完成同样需求,其思路如下图所示。它的另一个优点是具体的创建实例过程与客户端分离,客户端通过抽象接口操纵实例。它的缺点是如果需求来自增加功能,比如我们要增加项目表Project,则至少需要增加三个类IProject、SqlserverProject、AccessProject,还需要更改IFactory、SqlserverFactory、AccessFactory才可以完全实现。要修改三个类,过程有点糟糕。

    

   简单工厂+抽象工厂弥补了抽象工厂的不足,用DataAccess类代替IFactory、SqlserverFactory、AccessFactory三个工厂类。在DataAccess类中,用反射+配置文件实现数据访问,核心方法:Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”),根据配置文件的关键字,动态创建类,其其思路如下图所示。

    

     其实每种设计模式都有它的优缺点,我们必须在学习它们优点的同时也要考虑它们的缺点,这样才能在学习过程中游刃有余。但做人就不一样了,这里可以引用米老师的一句话: “如果只是追寻一个人的缺点,慢慢别人的缺点也会成为自己的缺点。但是如果总是看别人的优点,慢慢别人的优点也成为自己的优点。”

       希望我的讲解能对您的成长有所帮助。

你可能感兴趣的文章
fastjson深度源码解析- 词法和语法解析(三) - 针对对象实现解析
查看>>
fastjson深度源码解析- 反序列化(一) - 反序列化解析介绍
查看>>
fastjson深度源码解析- 反序列化(二) - 内部注册反序列化解析
查看>>
通过爱效率网站获取百度统计数据说明
查看>>
百度统计接口调用——登录接口
查看>>
百度统计接口调用——获取站点列表
查看>>
百度统计接口调用——获取站点访问数据
查看>>
Java WEB开发基础知识
查看>>
[Java Web开发系列课程]从0.5开始学习Java Web开发(一):学习大纲
查看>>
birt标签的使用
查看>>
2012年1月8号订火车票历程
查看>>
My97日期控件
查看>>
30分钟3300%性能提升——python+memcached网页优化小记
查看>>
confmgr项目,django,dwz相关问题
查看>>
linux文件共享
查看>>
linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结(tar包解压)
查看>>
vi和vim区别
查看>>
程序员经典语录
查看>>
Django性能优化
查看>>
python模块学习 ---- smtplib 邮件发送
查看>>