使用设计模式中的工厂方法模式进行C#编程的示例讲解

2019-12-26 18:02:10丽君


/// <summary>
  /// 肉末茄子这道菜
  /// </summary>
  public class MincedMeatEggplant : Food
  {
    /// <summary>
    /// 重写抽象类中的方法
    /// </summary>
    public override void Print()
    {
      Console.WriteLine("肉末茄子好了");
    }
  }
 /// <summary>
  /// 肉末茄子工厂类,负责创建肉末茄子这道菜
  /// </summary>
  public class MincedMeatEggplantFactory : Creator
  {
    /// <summary>
    /// 负责创建肉末茄子这道菜
    /// </summary>
    /// <returns></returns>
    public override Food CreateFoddFactory()
    {
      return new MincedMeatEggplant();
    }
  }
  /// <summary>
  /// 客户端调用
  /// </summary>
  class Client
  {
    static void Main(string[] args)
    {
          
      // 如果客户又想点肉末茄子了
      // 再另外初始化一个肉末茄子工厂
      Creator minceMeatEggplantFactor = new MincedMeatEggplantFactory();
      // 利用肉末茄子工厂来创建肉末茄子这道菜
      Food minceMeatEggplant = minceMeatEggplantFactor.CreateFoddFactory();
      minceMeatEggplant.Print();
      Console.Read();
    }
  }

工厂方法模式的UML图
讲解完工厂模式的具体实现之后,让我们看下工厂模式中各类之间的UML图:

使用设计模式中的工厂方法模式进行C#编程的示例讲解

从UML图可以看出,在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。针对UML图的解释如下:

Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类

TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory类:充当具体工厂角色,用来创建具体产品

Food类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类

TomatoScrambledEggs和ShreddedPorkWithPotatoes类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。

.NET中实现了工厂方法的类
.NET 类库中也有很多实现了工厂方法的类,例如Asp.net中,处理程序对象是具体用来处理请求,当我们请求一个*.aspx的文件时,此时会映射到System.Web.UI.PageHandlerFactory类上进行处理,而对*.ashx的请求将映射到System.Web.UI.SimpleHandlerFactory类中(这两个类都是继承于IHttpHandlerFactory接口的),关于这点说明我们可以在“C:WindowsMicrosoft.NETFrameworkv4.0.30319ConfigWeb.Config”文件中找到相关定义,具体定义如下: