• 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

  • 相关阅读:
    类和接口的区别
    ref 和out的区别
    重载 重写 多态区别
    UML种类与类的关系
    Window.open() 全攻略
    C#委托
    RT Diagnostics Routines
    tar.bz2 解压命令。
    教你10招最有效防电脑辐射方法
    预处理,编译, 优化, 汇编, 链接
  • 原文地址:https://www.cnblogs.com/liujie2272/p/13369156.html
Copyright © 2020-2023  润新知