工厂模式分为3种:简单工厂,工厂方法,抽象工厂
其中简单工厂是最简单的一种。简单工厂的作用是将客户端和类的创建进行解耦,因为客户端用到一个对象的地方可能有很多,一旦其中一个地方需要修改,则所有生成该对象的地方都要进行修改。
1.定义
简单工厂的UML图如下,拷贝自 链接
首先要声明很重要的一点,简单工厂是要生成抽象类或接口,而不是用来生成对象的,这点要明确,因为将抽象类和接口的生成进行封装,如果业务要修改只需要添加抽象类或接口的实现即可,这样就使系统对添加开发,对修改关闭了。
就像上图,FoodSimpleFactory类的CreateFood方法时为了生成Food类,这样就可以在使用方法不改变的前提下,将ShreddedPorkWithPotatos更换为TomatoScrambledEggs。
2.使用方法
我经常使用简单工厂,来重构大段的if判断,比如:
public void doSomething(int type) { if (type == 1) { //do something1 } else if (type == 2) { //do something2 } else if (type == 3) { //do something3 } }
这是一段很简单的if判断,在很多地方都会用到,我写web项目比较多,我以前经常像这样,type在这里就是http传输过来的参数,通过判断参数的不同,来分别执行不同的逻辑;
如果逻辑比较少,这样并不会有什么问题,但是一旦逻辑一多的话,这样的代码就会很难维护,因此这里我经常使用简单工厂来重构if,代码如下;
protected enum AjaxType { PICT_UPLOAD, SAVE_PRODUCT_INFO }
protected AjaxRunnable GetRunnable(AjaxType type) { switch (type) { case AjaxType.PICT_UPLOAD: return new AjaxPictUpload(); case AjaxType.SAVE_PRODUCT_INFO: return new AjaxSaveProductInfo(); default: return null; } } public interface AjaxRunnable { void Run(HttpContext context); } public class AjaxPictUpload : AjaxRunnable { public void Run(HttpContext context) { } } public class AjaxSaveProductInfo : AjaxRunnable { public void Run(HttpContext context) { } }
这样写有什么好处?
首先不同操作的逻辑分割到了不同的类里面了,看样子操作放到不同的类里面,和都放在同一个类里面,将if中的逻辑分割成不同的方法没有什么不同;
但是实际上,如果if判断中的逻辑特别多,那么一个判断可能就有很多不同的业务子操作,当把不同if中的业务子操作放在同一个一个类中的时候,逻辑就会显得很混乱;
但是如果用简单工厂,将同一业务中的逻辑封装在单独的类中,该类的内聚就会更高,当其中一个业务中的逻辑出现问题的时候,你通过该方法去定位问题就会显得特别迅速。
以上就是我使用简单工厂的地方
3.简单工厂的特点
优点:对象的生成统一放置在一个地方,将客户端和对象的生成解耦,之后如果对象的生成逻辑修改,则只需修改工厂类
缺点:如果有不同的对象需要生成,则不得不修改工厂类
一般简单工厂如果按照书本中的介绍,主要来事用来生成子类相对固定的接口,比如说.net framework就用简单工厂来生成字符编码对象,因为编码的类型相对固定。
但是我个人感觉,并不一定变态的视修改类为洪水猛兽,只要不是大段的修改,其实很多时候还是可以接受的,因此我觉得简单工程是一个很实用的设计模式,在编写代码的过程中肯定会经常遇到。
希望各位能有所收获。