zoukankan      html  css  js  c++  java
  • 工厂方法模式

    namespace 设计模式之工厂方法模式
    {
        /// <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 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();
            }
        }
    
        /// <summary>
        /// 客户端调用
        /// </summary>
        class Client
        {
            static void Main(string[] args)
            {
                // 初始化做菜的两个工厂()
                Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();
                Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();
    
                // 开始做西红柿炒蛋
                Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory();
                tomatoScrambleEggs.Print();
    
                //开始做土豆肉丝
                Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.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();
            }
        }  
  • 相关阅读:
    前后台验证字符串长度
    接口和抽象类该什么时候用?
    程序员常去网站汇总
    SQLServer复合查询条件(AND,OR,NOT)对NULL值的处理方法
    c#-轮询算法
    常用的SQL语句
    HTTP请求工具类
    asp.net mvc jQuery 城市二级联动
    ibatis动态多条件查询及模糊查询(oracle,mysql,sql)
    iBatis 中 Like 的写法实现模糊查询
  • 原文地址:https://www.cnblogs.com/gaocong/p/6763656.html
Copyright © 2011-2022 走看看