设计模式--简单工厂(个人笔记)

一、适用场景以及优缺点

    1.适用场景:

      当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式,

      客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式

    2.优点:

      解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。

      起到了代码复用的作用,因为之前的实现(自己做饭的情况)中,换了一个人同样要去在自己的类中实现做菜的方法,然后有了简单工厂之后,去餐馆吃饭的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的烧菜方法就让所有客户共用了。

    3.缺点

      工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响

      系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。

二、代码

      也就是将变化的代码写入到一个类里面,这个类就是简单工厂类,也就是简单工厂的原理。

    

 public ActionResult SimapleFactory()
        {
            // 客户想点一个西红柿炒蛋        
            Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");
            food1.Print();

            // 客户想点一个土豆肉丝
            Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");
            food2.Print();
            return View();
        }

  

/// <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 FoodSimpleFactory
    {
        public static Food CreateFood(string type)
        {
            Food food = null;
            if (type.Equals("土豆肉丝"))
            {
                food = new ShreddedPorkWithPotatoes();
            }
            else if (type.Equals("西红柿炒蛋"))
            {
                food = new TomatoScrambledEggs();
            }

            return food;
        }
    }

  此时,如果有个客户想要吃蛋炒饭,就需要在简单工厂类中加上蛋炒饭,并且新建一个继承于Food的蛋炒饭(EggAndRice)类

代码如下:

      

 /// <summary>
    /// 简单工厂类, 负责 炒菜
    /// </summary>
    public class FoodSimpleFactory
    {
        public static Food CreateFood(string type)
        {
            Food food = null;
            if (type.Equals("土豆肉丝"))
            {
                food = new ShreddedPorkWithPotatoes();
            }
            else if (type.Equals("西红柿炒蛋"))
            {
                food = new TomatoScrambledEggs();
            }
            else if (type.Equals("蛋炒饭"))
            {
                food = new EggAndRice();
            }

            return food;
        }
    }

    /// <summary>
    /// 蛋炒饭这道菜
    /// </summary>
    public class EggAndRice : Food
    {
        public override void Print()
        {
            Console.WriteLine("一份蛋炒饭");
        }
    }

   因此,简单工厂扩展起来相对麻烦些,在写代码时需要根据自己的需要选择设计模式,切勿适得其反。

 

 

 

     

posted @ 2018-12-27 10:47  蹦蹦郭  阅读(602)  评论(0编辑  收藏  举报