C#-设计模式-简单工厂

工厂模式分为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就用简单工厂来生成字符编码对象,因为编码的类型相对固定。

但是我个人感觉,并不一定变态的视修改类为洪水猛兽,只要不是大段的修改,其实很多时候还是可以接受的,因此我觉得简单工程是一个很实用的设计模式,在编写代码的过程中肯定会经常遇到。

希望各位能有所收获。

原文地址:https://www.cnblogs.com/gamov/p/10402269.html