zoukankan      html  css  js  c++  java
  • 设计模式(工厂模式)

    转载: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
  • 相关阅读:
    linux 下安装mongodb
    python 多线程, 多进程, 协程
    5.rabbitmq 主题
    4.rabbitmq 路由
    e.target与e.currentTarget对比
    使用ffmpeg下载m3u8流媒体
    本机添加多个git仓库账号
    IE hack 条件语句
    IE8 兼容 getElementsByClassName
    IE 下 log 调试的一点不同
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/11063327.html
Copyright © 2011-2022 走看看