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();
            }
        }  
  • 相关阅读:
    JS 页面生成锚点
    JavaScript AMD模块化规范
    Canvas文字的渲染基础 Better
    Canvas曲线绘制 Better
    clickhouse配置登录密码
    git pull 拉取报错:fatal: refusing to merge unrelated histories
    JAVA根据A星算法规划起点到终点二维坐标的最短路径
    JAVA使用netty建立websocket连接
    CSS设置文字超出部分自动换行
    SpringBoot(SpringMVC)使用addViewControllers设置统一请求URL重定向(映射、转发)配置
  • 原文地址:https://www.cnblogs.com/gaocong/p/6763656.html
Copyright © 2011-2022 走看看