设计模式(工厂模式)

转载:Learning hard

工厂模式:定义了一个创建产品对象的工厂接口,将实际创建工作推迟到子类工厂当中

代码

namespace ConsoleApplication1
{
  //菜的抽象类
  public abstract class Food
  {
    public abstract void Print();
  }

  //西红柿炒鸡蛋
  public class TomatoScrambledEggs : Food
  {
    public override void Print()
    {
      Console.WriteLine("西红柿炒鸡蛋好了");
    }
  }

  //土豆肉这道菜
  public class ShreddedPorkWithPotatoes : Food
  {
    public override void Print()
    {
      Console.WriteLine("土豆肉这道菜好了");
    }
  }

  //抽象工厂类
  public abstract class Creator
  {
    //工厂方法
    public abstract Food CreateFoodFactory();
  }

  public class TomatoScrambledEggsFactory : Creator
  {
    //负责创建西红柿炒蛋这道菜
    public override Food CreateFoodFactory()
    {
      return new TomatoScrambledEggs();
    }

  }

  public class ShreddedPorkWithPotatoesFactory : Creator
  {
    //负责创建土豆肉这道菜
    public override Food CreateFoodFactory()
    {
      return new ShreddedPorkWithPotatoes();
    }
  }

  public class Program
  {
    static void Main()
    {
      //初始化做菜的两个工厂
      Creator shreddedPorkWithPotatoeFactory = new ShreddedPorkWithPotatoesFactory();
      Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();

      //开始做西红柿炒蛋
      Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoodFactory();
      tomatoScrambleEggs.Print();

      //开始做土豆肉
      Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoeFactory.CreateFoodFactory();
      shreddedPorkWithPotatoes.Print();


      Console.ReadKey();
    }
  }

}

在此基础上增加新产品

使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们我们还想点一个“肉末茄子”,此时我们只需要定义一个肉末茄子具体工厂类和肉末茄子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现

  

/// <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();
  }
}

111
原文地址:https://www.cnblogs.com/zwj-199306231519/p/11063327.html