C#设计模式之简单工厂模式

2019-04-20  本文已影响0人  Memoyu
文章参考来源:http://www.cnblogs.com/zhili/p/SimpleFactory.html
感谢:Learning hard

认知尚浅,如有错误,愿闻其详!

解析简单工厂模式

1、理解:可以理解为负责生产对象的一个类

该原则就是封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装。降低对象之间的耦合度


2、例子

自己做菜吃与去餐馆吃饭 。

  • 自己吃饭,需要学习怎么做菜,自己动手做菜等。
  • 去餐馆吃只需要点菜,然后交给厨房厨师做就好。
3、例子中看出简单工厂模式的优点
  • 1:简单工厂去除了要吃饭的人(调用类)直接创建对象(煮菜)的责任,仅仅是调用方法(享用餐馆的饭菜),实现对责任的分割。
  • 2:第一点优点也间接的促进的这个优点,提高了代码的复用性。每个人想吃饭就去餐馆(工厂类),不用自己在去煮。
4、例子中看出简单工厂模式的缺点
  • 1:工厂类集中了所有产品的创建逻辑,一旦不能工作,则整个系统受到影响(餐馆关门的就没得饭吃了)。
  • 2:系统拓展困难,添加新产品,需要修改工厂逻辑。(工厂方法可以解决)
5、应用场景
  • 1:当工厂类负责创建的对象比较少时,可以使用。
  • 2:对工厂创建对象逻辑不关心,不在乎复杂性。
6、UML图
简单工厂模式UML.png

代码

using System;

namespace SimpleFactory
{
    class Program
    {
        /// <summary>
        /// 代码解析简单工厂模式
        /// </summary>
        static void Main(string[] args)
        {
            Console.WriteLine("自己煮:");
            CustomerCook.IWantEatFood();//一个人自己去煮菜吃
            Console.WriteLine();
            Console.WriteLine("餐馆煮:");
            CustomerRestaurant.IWantEatFood();//餐馆点餐


        }
        #region 自己去煮菜
        /// <summary>
        /// 自己煮菜
        /// </summary>
        class CustomerCook
        {

            /// <summary>
            /// 我想要吃的菜品
            /// </summary>
            public static void IWantEatFood()
            {
                Food food1 = Cook("炒蛋");//想吃,就自己做
                food1.Print();
                Food food2 = Cook("炒鸡肉");
                food2.Print();
            }
            /// <summary>
            /// 自己按照菜名来煮出对应的菜品
            /// </summary>
            /// <param name="type">菜名</param>
            /// <returns>返回做好的菜</returns>
            public static Food Cook(string type)
            {
                Food food = null;
                if (type.Equals("炒蛋"))//根据自己菜名,做出对应的菜式
                {
                    food = new ScrambledEgg();
                }
                else if (type.Equals("炒鸡肉"))
                {
                    food = new ScrambledChicken();
                }
                return food;
            }

        }
        #endregion
        #region 餐馆点餐(简单工厂模式)
        class CustomerRestaurant
        {
            /// <summary>
            /// 我想要吃的菜品
            /// </summary>
            public static void IWantEatFood()
            {
                Food food1 = RestaurantFactory.CreateFood("炒蛋");//想吃,就点菜,让厨师做
                food1.Print();
                Food food2 = RestaurantFactory.CreateFood("炒鸡肉");
                food2.Print();
            }
        }
        /// <summary>
        /// 餐厅工厂类
        /// </summary>
        public static class RestaurantFactory
        {
            public static Food CreateFood(string type)//工厂创建对象方法
            {
                Food food = null;
                if (type.Equals("炒蛋"))
                {
                    food = new ScrambledEgg();
                }
                else if (type.Equals("炒鸡肉"))
                {
                    food = new ScrambledChicken();
                }

                return food;
            }
        }
        #endregion


        /// <summary>
        /// 菜品抽象类
        /// </summary>
        public abstract class Food
        {
            public abstract void Print();//抽象菜品方法
        }
        /// <summary>
        /// 实现炒蛋类
        /// </summary>
        public class ScrambledEgg : Food
        {
            public override void Print()//重写方法
            {
                Console.WriteLine("一份炒蛋");
            }
        }
        /// <summary>
        /// 实现炒蛋类
        /// </summary>
        public class ScrambledChicken : Food
        {
            public override void Print() //重写方法
            {
                Console.WriteLine("一份炒鸡肉");
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读