C#设计模式之简单工厂模式(Factory method pattern)

一、什么是简单工厂模式?

  简单工厂模式实质是一个工厂类根据传入的参数(产品类继承自同一个工厂类),动态的创建哪个产品类的是实例。

二、简单工厂模式的结构

  工厂角色:简单工厂模式的核心,负责创建所有具体产品类的实例,工厂类可以被外界直接调用,创建所需的产品实例。

  抽象产品角色:是指具体产品角色的父类,负责描述所有产品实例所共有的公共借口。(即所有产品的所共有的并形成抽象)。

  具体产品角色:继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标实例,工厂类返回的都是该角色的某一个具体的产品。

三、简单工厂模式的应用场景

  日常生活中的中,我们上班到了中午,我们需要吃饭,一种是自己带饭,可前天晚上把饭和菜做好,再用碗装着,第二天上班时再带到公司里来,但这过于麻烦,二种是我们去公司食堂里面吃饭,我们只需告诉老板娘我们想吃什么菜就可以了,煮饭和炒菜事情交个食堂就行了,这里的食堂充当工厂角色,菜充当了具体的产品角色。

  在以下情况下可以使用简单工厂模式:

  1. 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

四、简单工厂模式的优缺点

优点:

  1.  工厂类是整个模式的关键,包含一些逻辑判断,并根据传入的参数,决定究竟应该创建哪个具体类的对象。
  2.  通过工厂类,外界可以从具体创建具体产品对象的尴尬局面摆脱出来,仅只需要负责“消费”对象就可以了。
  3. 不必管这些对象究竟如何创建及如何组织的,明确了各自的职责和权利,有利于整个软件体系结构的优化。

缺点: 

  1. 工厂类集中了所有的实例的创建逻辑,违反了开闭原则,将全部的创建的逻辑集中到一个工厂类中
  2.  工厂类所创建的产品实例是实现考虑的,如果需要添加新的产品,需修改工厂类。

五、简单工厂模式的实现

 /// <summary>
    /// 食堂工厂类(工厂角色)
    /// </summary>
    public class CanTenFactory
    {
        public static Food CreateFood(string foodType)
        {
            Food food = null;
            switch (foodType)
            {
                case "Egg":
                    food = new Egg();
                    break;
                case "Potatosilk":
                    food = new Potatosilk();
                    break;
            }
            return food;
        }
    }
    /// <summary>
    /// 菜抽象类(抽象产品角色)
    /// </summary>
    public abstract class Food
    {
        public abstract void PrintFood();
    }
/// <summary>
    /// 鸡蛋(具体产品角色)
    /// </summary>
    public class Egg : Food
    {
        public override void PrintFood()
        {
            Console.WriteLine("一份鸡蛋");
        }
    }
 /// <summary>
    /// 土豆丝 (具体的产品角色)
    /// </summary>
    public class Potatosilk : Food
    {
        public override void PrintFood()
        {
            Console.WriteLine("一份土豆丝");
        }
    }
/// <summary>
    /// 客户端调用
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("**************您好,您今天吃什么菜呢?**************");

            Console.WriteLine("**************麻烦您帮我来一份鸡蛋和土豆丝吧!**************");

            Food egg = CanTenFactory.CreateFood("Egg");
            egg.PrintFood();

            Food potatosilk = CanTenFactory.CreateFood("Potatosilk");
            potatosilk.PrintFood();

            Console.ReadKey();
        }
    }

结果:

 源码:FactoryMethodPattern

posted @ 2020-07-23 23:45  编程老男孩  阅读(434)  评论(0编辑  收藏  举报