zoukankan      html  css  js  c++  java
  • C#设计模式——工厂方法模式

    一、引言

      在简单工厂中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的。

    二、工厂方法模式的实现

      工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。下面看下工厂模式的具体实现代码(这里还是以简单工厂模式中点菜的例子来实现):

        /// <summary>
        /// 菜的抽象对象
        /// </summary>
        public abstract class Food
        {
            // 输出点了什么菜
            public abstract void Print();
        }
        /// <summary>
        /// 炒土豆丝
        /// </summary>
        public class FriedPotatoShreds : Food
        {
            public override void Print()
            {
                Console.WriteLine("炒土豆丝");
            }
        }
        /// <summary>
        /// 尖椒炒鸡蛋
        /// </summary>
        public class PepperFriedEgg : Food
        {
            public override void Print()
            {
                Console.WriteLine("尖椒炒鸡蛋!");
            }
        }
        /// <summary>
        /// 西红柿炒鸡蛋
        /// </summary>
        public class ScrambledEggTomato : Food
        {
            public override void Print()
            {
                Console.WriteLine("一份西红柿炒蛋!");
            }
        }
        /// <summary>
        /// 抽象工厂类
        /// </summary>
        public abstract class Creator
        {
            // 工厂方法
            public abstract Food CreateFoddFactory();
        }
    
        /// <summary>
        /// 炒土豆丝工厂
        /// </summary>
        public class FriedPotatoShredsFactory : Creator
        {
            public override Food CreateFoddFactory()
            {
                return new FriedPotatoShreds();
            }
        }
        /// <summary>
        /// 尖椒炒鸡蛋工厂
        /// </summary>
        public class PepperFriedEggFactory : Creator
        {
            public override Food CreateFoddFactory()
            {
                return new PepperFriedEgg();
            }
        }
        /// <summary>
        /// 西红柿炒鸡蛋工厂
        /// </summary>
        public class ScrambledEggTomatoFactory : Creator
        {
            public override Food CreateFoddFactory()
            {
                return new ScrambledEggTomato();
            }
        }

      

      /// <summary>
            /// 客户端调用
            /// </summary>
            class Client
            {
                static void Main(string[] args)
                {
                    // 初始化做菜的两个工厂()
                    Creator scrambledEggTomatoFactory = new ScrambledEggTomatoFactory();
                    Creator pepperFriedEggFactory = new PepperFriedEggFactory();
    
                    // 开始做西红柿炒蛋
                    Food tomatoScrambleEggs = pepperFriedEggFactory.CreateFoddFactory();
                    tomatoScrambleEggs.Print();
    
                    //开始做土豆肉丝
                    Food shreddedPorkWithPotatoes = scrambledEggTomatoFactory.CreateFoddFactory();
                    shreddedPorkWithPotatoes.Print();
    
                    Console.Read();
                }
            }
    

      使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们我们还想点一个“肉末茄子”,此时我们只需要定义一个肉末茄子具体工厂类肉末茄子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:

    /// <summary>
        /// 肉末茄子这道菜
        /// </summary>
        public class MincedMeatEggplant : Food
        {
            /// <summary>
            /// 重写抽象类中的方法
            /// </summary>
            public override void Print()
            {
                Console.WriteLine("肉末茄子好了");
            }
        }
     /// <summary>
        /// 肉末茄子工厂类,负责创建肉末茄子这道菜
        /// </summary>
        public class MincedMeatEggplantFactory : Creator
        {
            /// <summary>
            /// 负责创建肉末茄子这道菜
            /// </summary>
            /// <returns></returns>
            public override Food CreateFoddFactory()
            {
                return new MincedMeatEggplant();
            }
        }
    
        /// <summary>
        /// 客户端调用
        /// </summary>
        class Client
        {
            static void Main(string[] args)
            {
               
                // 如果客户又想点肉末茄子了
                // 再另外初始化一个肉末茄子工厂
                Creator minceMeatEggplantFactor = new MincedMeatEggplantFactory();
    
                // 利用肉末茄子工厂来创建肉末茄子这道菜
                Food minceMeatEggplant = minceMeatEggplantFactor.CreateFoddFactory();
                minceMeatEggplant.Print();
    
                Console.Read();
            }
        }
    

      

    厂方法模式的定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式让一个类的实例化延迟到其子类。

    工厂方法模式的结构

    总结:Factory Method模式

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式让一个类的实例化延迟到其子类。

    Factory Method—参与者

  • 相关阅读:
    转载:SQL Server错误 2812 :未能找到存储过程 ***的解决方法
    转载:mysql5.7设置不区分大小写
    无法对数据库'XXX' 执行删除,因为它正用于复制"
    Win7 64位 部分软件和文档字体显示乱码
    转载:创建对于用户sa失败,sa无法映射到数据库
    sqlserver 用户角色权限
    转发:Nginx可视化配置工具—NginxWebUI
    docker-compose安装
    导入导出windows 防火墙规则
    python 打包pyinstaller 问题记录
  • 原文地址:https://www.cnblogs.com/sjkzy/p/7103729.html
Copyright © 2011-2022 走看看