标签:style blog c ext http color
前几天一直在准备大学毕业,始终脱不开身,今天终于有时间进行设计模式的研究。咱们今天研究的话题是工厂家族三种设计模式的对比--简单工厂VS工厂VS抽象工厂。
经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版。知道了它们之间的宏观关系,下面我带它们从一次次蜕变了解它们为什么是这样的关系。
我们最原始的代码思维是把所有的实现都放在一个类中,功能虽然是实现了,但耦合性非常高,很不方便维护,好比活字印刷术之前的印刷,一个地方需要修改,则全部内容都需要推倒重来。
简单工厂解决了上述问题,简单工厂中的工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,其思路如下图所示。但它有个致命的缺点:违反开放-封闭原则,比如当需要创建“开方类”的时候,需要修改“简单工厂类”中的方法。
工厂模式弥补简单工厂的不足,将一个类的实例化延迟到其子类。工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,如果想要添加功能,只需修改客户端即可。比如添加“开方类”,只需在运算类下面添加一个“开方类”,在抽象工厂下面添加一个“开方工厂”即可,保证了开方-封闭原则,其思路如下图所示。但它的缺点是每加一个运算类,就需要加一个运算工厂的类,增加了额外的开发量。
抽象工厂弥补了工厂模式的不足,抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。比如按工厂模式的思想,SqlserverUser类、AccessUser类、SqlDepartment类、AccessDepartment类需要四个工厂来创建,而抽象工厂对它们公共的部分进行了抽象,只需两个工厂就能完成同样需求,其思路如下图所示。它的另一个优点是具体的创建实例过程与客户端分离,客户端通过抽象接口操纵实例。它的缺点是如果需求来自增加功能,比如我们要增加项目表Project,则至少需要增加三个类IProject、SqlserverProject、AccessProject,还需要更改IFactory、SqlserverFactory、AccessFactory才可以完全实现。要修改三个类,过程有点糟糕。
简单工厂+抽象工厂弥补了抽象工厂的不足,用DataAccess类代替IFactory、SqlserverFactory、AccessFactory三个工厂类。在DataAccess类中,用反射+配置文件实现数据访问,核心方法:Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”),根据配置文件的关键字,动态创建类,其其思路如下图所示。
其实每种设计模式都有它的优缺点,我们必须在学习它们优点的同时也要考虑它们的缺点,这样才能在学习过程中游刃有余。但做人就不一样了,这里可以引用米老师的一句话: “如果只是追寻一个人的缺点,慢慢别人的缺点也会成为自己的缺点。但是如果总是看别人的优点,慢慢别人的优点也成为自己的优点。”
希望我的讲解能对您的成长有所帮助。
一口一个设计模式--简单工厂VS工厂VS抽象工厂,布布扣,bubuko.com
标签:style blog c ext http color
原文地址:http://blog.csdn.net/quwenzhe/article/details/25987593