using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovinu.Du.DuAbstractFactory.Meals.Common
{

    /// <summary>
    ///抽象工厂 模式 Abstract Factory Pattern
    /// </summary>
    public interface IMeal
    {
        /// <summary>
        /// 
        /// </summary>
        void ShowAmountOfCalories();
        /// <summary>
        /// 
        /// </summary>
        void ShowDescription();
    }
}

    /// <summary>
    ///宫爆鸡丁 Kung Pao Chicken
    /// </summary>
    public class KungPao : IMeal
    {

        /// <summary>
        /// 热量
        /// </summary>
        public void ShowAmountOfCalories()
        {
            Console.WriteLine("热量: 899 卡");
        }
        /// <summary>
        /// 
        /// </summary>
        public void ShowDescription()
        {
            Console.WriteLine("宫爆鸡丁: 鲜鸡肉,酒,味精,盐,蒜,桂皮,八角等");
        }
    }

    /// <summary>
    /// 面条
    /// </summary>
    public class Noodles : IMeal
    {

        /// <summary>
        /// 热量 显示卡路里
        /// </summary>
        public void ShowAmountOfCalories()
        {
            Console.WriteLine("热量: 880 卡");
        }
        /// <summary>
        /// 
        /// </summary>
        public void ShowDescription()
        {
            Console.WriteLine("面条: 面,葱姜,老骨汤等.");
        }
    }


    /// <summary>
    /// 
    /// </summary>
    public class NullMeal : IMeal
    {
        /// <summary>
        /// 
        /// </summary>
        public void ShowAmountOfCalories()
        {
        }
        /// <summary>
        /// 
        /// </summary>
        public void ShowDescription()
        {
        }
    }

using Geovin.Du.DuAbstractFactory.Meals;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Geovinu.Du.DuAbstractFactory.Meals.Common;



namespace Geovin.Du.DuAbstractFactory.Factories
{

    /// <summary>
    /// 
    /// </summary>
    public class MealFactory
    {
        /// <summary>
        /// 
        /// </summary>
        private Dictionary<string, Type> _meals;
        /// <summary>
        /// 
        /// </summary>
        public MealFactory()
        {
            LoadAvailableMealTypes();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="mealName"></param>
        /// <returns></returns>
        public IMeal CreateMeal(string mealName)
        {
            var type = GetTypeForCreation(mealName);
            if (type == null)
            {
                return new NullMeal();
            }

            return Activator.CreateInstance(type) as IMeal;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="check"></param>
        /// <returns></returns>
        public IMeal CreateMealInt(string check)
        {
            string mealName = check=="1"? "kungpao" : "noodles";
            //if (check == "0")
            //    mealName = "KungPao";
            //if (check == "1")
            //    mealName = "KungPao";
            //if (check == "2")
            //    mealName = "Noodles";
            var type = GetTypeForCreation(mealName);
            if (type == null)
            {
                return new NullMeal();
            }

            return Activator.CreateInstance(type) as IMeal;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="mealName"></param>
        /// <returns></returns>
        private Type GetTypeForCreation(string mealName)
        {
            if (!_meals.TryGetValue(mealName, out Type type))
            {
                return null;
            }

            return type;
        }

        /// <summary>
        /// 
        /// </summary>
        private void LoadAvailableMealTypes()
        {
            _meals = new Dictionary<string, Type>();

            Type[] assemblyTypes = Assembly.GetExecutingAssembly().GetTypes();

            foreach (Type type in assemblyTypes)
            {
                if (type.GetInterface(typeof(IMeal).ToString()) != null)
                {
                    _meals.Add(type.Name.ToLower(), type);
                }
            }
        }
    }
}

    /// <summary>
    /// 
    /// </summary>
    public class Executor : PatternExecutor
    {

        /// <summary>
        /// 
        /// </summary>
        public override string Name => "/抽象工厂 模式 Abstract Factory Pattern (Simple Factory) - Creational Pattern";

        /// <summary>
        /// 
        /// </summary>
        public override void Execute()
        {
            Console.WriteLine("请你输入要点的餐数字编号 (1.KungPao,2.Noodles): ");
            string mealName = Console.ReadLine();

           MealFactory factory = new MealFactory();
            IMeal meal = factory.CreateMealInt(mealName);
             //IMeal meal = factory.CreateMeal(mealName);
            meal.ShowDescription();
            meal.ShowAmountOfCalories();
        }
    }

  

调用:

            Geovin.Du.DuAbstractFactory.Executor duex = new Geovin.Du.DuAbstractFactory.Executor();
            duex.Execute();

  

输出:

请你输入要点的餐数字编号 (1.KungPao,2.Noodles):
1
宫爆鸡丁: 鲜鸡肉,酒,味精,盐,蒜,桂皮,八角等
热量: 899 卡

  

 

原文地址:http://www.cnblogs.com/geovindu/p/16861868.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性