zoukankan      html  css  js  c++  java
  • 设计模式--简单工厂(个人笔记)

    一、适用场景以及优缺点

        1.适用场景:

          当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式,

          客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式

        2.优点:

          解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。

          起到了代码复用的作用,因为之前的实现(自己做饭的情况)中,换了一个人同样要去在自己的类中实现做菜的方法,然后有了简单工厂之后,去餐馆吃饭的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的烧菜方法就让所有客户共用了。

        3.缺点

          工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响

          系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。

    二、代码

          也就是将变化的代码写入到一个类里面,这个类就是简单工厂类,也就是简单工厂的原理。

        

     public ActionResult SimapleFactory()
            {
                // 客户想点一个西红柿炒蛋        
                Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");
                food1.Print();
    
                // 客户想点一个土豆肉丝
                Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");
                food2.Print();
                return View();
            }
    

      

    /// <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 class FoodSimpleFactory
        {
            public static Food CreateFood(string type)
            {
                Food food = null;
                if (type.Equals("土豆肉丝"))
                {
                    food = new ShreddedPorkWithPotatoes();
                }
                else if (type.Equals("西红柿炒蛋"))
                {
                    food = new TomatoScrambledEggs();
                }
    
                return food;
            }
        }
    

      此时,如果有个客户想要吃蛋炒饭,就需要在简单工厂类中加上蛋炒饭,并且新建一个继承于Food的蛋炒饭(EggAndRice)类

    代码如下:

          

     /// <summary>
        /// 简单工厂类, 负责 炒菜
        /// </summary>
        public class FoodSimpleFactory
        {
            public static Food CreateFood(string type)
            {
                Food food = null;
                if (type.Equals("土豆肉丝"))
                {
                    food = new ShreddedPorkWithPotatoes();
                }
                else if (type.Equals("西红柿炒蛋"))
                {
                    food = new TomatoScrambledEggs();
                }
                else if (type.Equals("蛋炒饭"))
                {
                    food = new EggAndRice();
                }
    
                return food;
            }
        }
    
        /// <summary>
        /// 蛋炒饭这道菜
        /// </summary>
        public class EggAndRice : Food
        {
            public override void Print()
            {
                Console.WriteLine("一份蛋炒饭");
            }
        }

       因此,简单工厂扩展起来相对麻烦些,在写代码时需要根据自己的需要选择设计模式,切勿适得其反。

         

  • 相关阅读:
    [原]实例-简单设计&精简代码&复用代码
    [原创]实例-少用单例及降低耦合
    c#实现数据集合转换为csv文本
    [转]SqlServer索引的原理与应用
    [转]AngularJS:何时应该使用Directive、Controller、Service?
    [转]AngularJS移动开发中的坑汇总
    [转]Hibernate对象的三种状态
    [转]AngularJS Cookies Example
    [转]LESS CSS 框架简介
    [转]为ReportViewer导出的PDF文档加上水印
  • 原文地址:https://www.cnblogs.com/BounceGuo/p/10183363.html
Copyright © 2011-2022 走看看