实例解析C#设计模式编程中简单工厂模式的使用

2019-12-26 18:02:51王冬梅

自己做饭,如果我们想吃别的菜时,此时就需要去买这种菜和洗菜这些繁琐的操作,有了餐馆(也就是简单工厂)之后,我们就可以把这些操作交给餐馆去做,此时消费者(也就是我们)对菜(也就是具体对象)的依赖关系从直接变成的间接的,这样就是实现了面向对象的另一个原则——降低对象之间的耦合度,下面就具体看看有了餐馆之后的实现代码(即简单工厂的实现):


/// <summary>
  /// 顾客充当客户端,负责调用简单工厂来生产对象
  /// 即客户点菜,厨师(相当于简单工厂)负责烧菜(生产的对象)
  /// </summary>
  class Customer
  {
    static void Main(string[] args)
    {
      // 客户想点一个西红柿炒蛋   
      Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");
      food1.Print();
      // 客户想点一个土豆肉丝
      Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");
      food2.Print();
      Console.Read();
    }
  }
  /// <summary>
  /// 菜抽象类
  /// </summary>
  public abstract class Food
  {
    // 输出点了什么菜
    public abstract void Print();
  }
  /// <summary>
  /// 西红柿炒鸡蛋这道菜
  /// </summary>
  public class TomatoScrambledEggs : Food
  {
    public override void Print()
    {
      Console.WriteLine("一份西红柿炒蛋!");
    }
  }
  /// <summary>
  /// 土豆肉丝这道菜
  /// </summary>
  public class ShreddedPorkWithPotatoes : Food
  {
    public override void Print()
    {
      Console.WriteLine("一份土豆肉丝");
    }
  }
  /// <summary>
  /// 简单工厂类, 负责 炒菜
  /// </summary>
  public class FoodSimpleFactory
  {
    public static Food CreateFood(string type)
    {
      Food food = null;
      if (type.Equals("土豆肉丝"))
      {
        food= new ShreddedPorkWithPotatoes();
      }
      else if (type.Equals("西红柿炒蛋"))
      {
        food= new TomatoScrambledEggs();
      }
      return food;
    }
  }

此外,这里还有一个反射实现简单工厂模式的例子:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
  public interface IFruit
  {
  }

  public class Orange : IFruit
  {
    public Orange()
    {
      Console.WriteLine("An orange is got!");
    }
  }

  public class Apple : IFruit
  {
    public Apple()
    {
      Console.WriteLine("An apple is got!");
    }
  }

  public class FruitFactory
  {
    private static FruitFactory _instance = new FruitFactory();
    public static FruitFactory Instance
    {
      get { return _instance; }
    }

    public IFruit MakeFruit(string Name)
    {
      IFruit MyFruit = null;
      try
      {
        Type type = Type.GetType(Name, true);
        MyFruit = (IFruit)Activator.CreateInstance(type);
      }
      catch (TypeLoadException e)
      {
        Console.WriteLine("I dont know this kind of fruit,exception caught - {0}", e.Message);
      }
      return MyFruit;
    }
  }

  public class Test
  {
    static void Main()
    {
      string FruitName = Console.ReadLine();
      FruitFactory.Instance.MakeFruit("ConsoleApplication1." + FruitName);
    }
  }
}