重构&设计模式

C#设计模式之工厂方法模式

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

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

解析工厂方法模式

工厂方法的出现解决简单工厂中的难以拓展的问题,解决了其一旦添加新的产品,则需要修改简单工厂方法,进而造成简单工厂的实现逻辑过于复杂。

1、例子

依旧是简单工厂模式中的去餐馆实现问题。
此时,工厂类不再实现具体的创建产品(对象),而是延伸至子类,工厂类只需要给出必须实现的借口。这样只要有新的产品,只需要创建子类继承于工厂类,实现接口即可。

2、例子中看出工厂方法模式的优点

解决了简单工厂模式的缺点,省去简单工厂模式复杂的创建对象逻辑,符合了开放闭合原则(即对扩展开发,对修改封闭)。

4、例子中看出工厂方法模式的缺点

例子中可以看出,工厂的职能比较单一,只能产出菜,如果是我需要冰饮,则无法做到。

3、应用场景

替代简单工厂模式实现复杂的对象工厂创建。

4、UML图

在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。

工厂方法模式UML.png

代码

using System;

namespace FactoryMethodPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            CustomerRestaurant.IWantEatFood();//客户点菜
        }
        /// <summary>
        /// 某位客户
        /// </summary>
        class CustomerRestaurant
        {
            /// <summary>
            /// 我想要吃的菜品
            /// </summary>
            public static void IWantEatFood()
            {
                RestaurantFactory scrambledEgg = new ScrambledEggFactory();//点的是炒蛋,则初始化炒蛋工厂
                Food food1 = scrambledEgg.CreateFood();//工厂创建出炒蛋这道菜
                food1.Print();

                RestaurantFactory scrambledChicken = new ScrambledchickenFactory ();
                Food food2 = scrambledChicken.CreateFood();
                food2.Print();
                //////////////////////////////////////////
                ///客户还想吃炒青瓜,点了炒青瓜
                RestaurantFactory scrambledCucumber = new ScrambledCucumberFactory();
                Food food3 = scrambledCucumber.CreateFood();
                food3.Print();
                /////////////////////////////////////////

            }
        }

        /// <summary>
        /// 餐馆工厂类
        /// </summary>
        public abstract class RestaurantFactory
        {
            public abstract Food CreateFood();//餐厅工厂方法
        }
        /// <summary>
        /// 炒蛋工厂类
        /// </summary>
        public class ScrambledEggFactory : RestaurantFactory
        {
            public override Food CreateFood()//负责创建炒蛋这道菜
            {
                return new ScrambledEgg();
            }
        }
        /// <summary>
        /// 炒鸡肉工厂类
        /// </summary>
        public class ScrambledchickenFactory : RestaurantFactory
        {
            public override Food CreateFood()//负责创建炒鸡肉这道菜
            {
                return new ScrambledChicken();
            }
        }

        /////////////////////////////////////////////////////
        ///根据客户的需求,添加炒青瓜
        public class ScrambledCucumberFactory:RestaurantFactory
        {
            public override Food CreateFood()//负责创建炒青瓜这道菜
            {
                return new ScrambledCucumber();
            }
        }
        ////////////////////////////////////////////////////

        /// <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("一份炒鸡肉");
            }
        }
        ////////////////////////////////////////////////////
        ///根据客户需求,添加炒青瓜
        /// <summary>
        /// 实现炒青瓜类
        /// </summary>
        public class ScrambledCucumber : Food
        {
            public override void Print()//重写方法
            {
                Console.WriteLine("一份炒青瓜");
            }
        }
        ////////////////////////////////////////////////////
    }
}

上一篇 下一篇

猜你喜欢

热点阅读