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

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

    希望各位能有所收获。

  • 相关阅读:
    工作笔记总结——数据库
    PHP 的本地文件缓存处理类(非常高效)
    word如何去掉背景色
    安装CORBA产品visibroker注意问题
    [Python小菜]Bulidin Function Type使用小记
    java正则表达式和网页爬虫的制作
    工作笔记总结——前台js和jQuery
    thinkphp+ajax 实现点击加载更多数据
    第三方微信登录
    substring() 方法用于提取字符串中介于两个指定下标之间的字符。
  • 原文地址:https://www.cnblogs.com/gamov/p/10402269.html
Copyright © 2011-2022 走看看