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

    简单工厂存在问题:对象统一行为抽象成一个接口(或者抽象类)之后,再根据传入的类型进行创建实例,但这只适用固定行为的场合,当要实现接口的类型处于不定数,则不适合使用简单工厂模式,而应该使用工厂方法

    工厂方法适合场合:
    子类有统一的操作行为
    子类的数量不固定,随时可能有新的功能子类出现
    工厂方法优势:
    子类之间是并列的,耦合度比较大
    创建具体对象方法灵活,可以使用反射或者第三方IOC容器

      /// <summary>
        /// 菜抽象类
        /// </summary>
        public abstract class Food
        {
            //输出点了什么菜
            public abstract string Print();
        }
        public class TomatoScrambledEggs : Food
        {
            public override string  Print()
            {
                return "西红柿炒鸡蛋";
            }
        }
        public class ShreddedPorkWithPotatoes : Food
        {
            public override string Print()
            {
                return "土豆丝炒鸡蛋";
            }
        }
        /// <summary>
        /// 抽象工厂类
        /// </summary>
        public abstract class Creator
        {
            /// <summary>
            /// 工厂方法
            /// </summary>
            /// <returns></returns>
            public abstract Food CreateFoddFactory();
        }
        /// <summary>
        /// 西红柿炒鸡蛋工厂类
        /// </summary>
        public class TomatoScrambledEggsFactory : Creator
        {
            public override Food CreateFoddFactory()
            {
                return new TomatoScrambledEggs();
            }
        }
        /// <summary>
        /// 土豆丝炒鸡蛋工厂类
        /// </summary>
        public class ShreddedPorkWithPotatoesFactory:Creator
        {
            public override Food CreateFoddFactory()
            {
                return new ShreddedPorkWithPotatoes();
            }
        }
    View Code

    调用:

      public void Get()
            {
                // 初始化做菜的两个工厂()
                Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();
                Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();
    
                // 开始做西红柿炒蛋
                Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory();
                string dd =  tomatoScrambleEggs.Print();
    
                //开始做土豆肉丝
                Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoddFactory();
               string dd2 =  shreddedPorkWithPotatoes.Print();
            }
    View Code

    缺点:

    工厂方法是为了克服工厂模式的缺点而设计出来的,每个工厂方法每个具体工厂类只完成单个实例的创建,但是现实生活中,一个工厂只创建单个产品的例子太少啦,所以需要抽象工厂模式:

  • 相关阅读:
    Duilib 入门教程: 怎么创建一个自定义的窗口
    从屏幕右下角升起的弹窗
    最小化窗口至右下角
    MFC 使程序不在任务栏显示
    创建数据库
    sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close
    VC++、MFC中最好的开源项目
    在MFC中,利用GDI绘制橡皮筋效果-直线,圆,椭圆,矩形
    WCHAR char CString等常用类型互转
    CGAL 计算机几何算法库
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5641159.html
Copyright © 2011-2022 走看看