zoukankan      html  css  js  c++  java
  • 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就用简单工厂来生成字符编码对象,因为编码的类型相对固定。

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

    希望各位能有所收获。

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/gamov/p/10402269.html
Copyright © 2011-2022 走看看