03-C#设计模式-工厂方法模式

287 次浏览次阅读

工厂方法模式的介绍

简单工厂模式中解决了调用类强依赖实现类的情况,但是简单工厂模式存在弊端,如果需要增加新的实现就需要修改工厂实现方法。这不符合开闭原则,对扩展开放对修改屏蔽。对于已经正常运行的功能代码修改会带来不确定性,应该尽量避免修改已有代码而是通过扩展的方式修改原有功能。

工厂方法模式的用途

工厂方法模式的用途与简单工厂模式用途相同,降低功能类和调用类的强依赖关系。

工厂方法模式的思路

修改原有简单工厂代码中的工厂类,新工厂类已抽象类作为返回值,返回不同实现的具体实例

C# 实现代码

    /// <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 Customer
    {
        public static void CreateFood()
        {
            // 客户想点一个西红柿炒蛋        
            #region 简单工厂模式
            Food food1 = SimpleFactory.CreateFood("西红柿炒蛋");
            food1.Print();

            // 客户想点一个土豆肉丝
            Food food2 = SimpleFactory.CreateFood("土豆肉丝");
            food2.Print();
            #endregion

            #region 工厂方法模式
            Creator tomatorFactory = new TomatoScrambledEggsFactory();
            tomatorFactory.CreateFoddFactory().Print();

            Creator shreddedPorkFactory = new ShreddedPorkWithPotatoesFactory();
            shreddedPorkFactory.CreateFoddFactory().Print();
            #endregion

            Console.Read();
        }
    }
    /// <summary>
    /// 简单工厂类
    /// </summary>
    public class SimpleFactory
    {
        /// <summary>
        /// 根据菜名创建具体的实例
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static Food CreateFood(string type)
        {
            Food food = null;

            if (type.Equals("土豆肉丝"))
            {
                food = new ShreddedPorkWithPotatoes();
            }
            else if (type.Equals("西红柿炒蛋"))
            {
                food = new TomatoScrambledEggs();
            }

            return food;
        }
    }
    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class Creator
    {
        // 工厂方法
        public abstract Food CreateFoddFactory();
    }

    /// <summary>
    /// 西红柿炒蛋工厂类
    /// </summary>
    public class TomatoScrambledEggsFactory : Creator
    {
        /// <summary>
        /// 负责创建西红柿炒蛋这道菜
        /// </summary>
        /// <returns></returns>
        public override Food CreateFoddFactory()
        {
            return new TomatoScrambledEggs();
        }
    }

    /// <summary>
    /// 土豆肉丝工厂类
    /// </summary>
    public class ShreddedPorkWithPotatoesFactory : Creator
    {
        /// <summary>
        /// 负责创建土豆肉丝这道菜
        /// </summary>
        /// <returns></returns>
        public override Food CreateFoddFactory()
        {
            return new ShreddedPorkWithPotatoes();
        }
    }
正文完
 
马化云
版权声明:本站原创文章,由 马化云 2023-10-17发表,共计1964字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。