• c#设计模式(2)——简单工厂模式


    一、引言

           最近看了一些设计模式的介绍,感觉可以总结一下,形成自己的笔记。

          部分内容选自https://www.cnblogs.com/zhili/p/SingletonPatterm.html,感觉写得很好,我只是自己总结成自己的东西。

    二、介绍

        说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了? 在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类, 我们平常编程中,当使用"new"关键字创建一个对象时,此时该类就依赖与这个对象,也就是他们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码。

        有了简单工厂之后,我们就可以把这些操作交给工厂去做,将具体的操作交由工厂去实现。

         1.首先,我们定义一下各路英雄的展示方式

       

      public interface IRace
        {
            /// <summary>
            /// show出王者
            /// </summary>
            void ShowKing();
        }
    

      2.然后实现接口的具体实现方法

     public class NE : IRace
        {
            public void ShowKing()
            {
                Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Moon");
            }
        }
    

      

     public class ORC : IRace
        {
            public void ShowKing()
            {
                Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Army");
            }
        }
    

      3.现在设计出来各路英雄具体的登场方式了,如何优雅的去实例化这些对象,展示这些登场方式呢?显然,如果在主函数实例化这些对象,就使得主函数和这些具体实现太耦合了,也就没有用到简单工厂了,如果不在主函数那里示例话具体对象,就需要甩锅给工厂,让工厂去实例化各路英雄的展示方式。

          

     public enum RaceType
        {
            ORC,
            NE
        }
    
    
     public class FactoryObject
        {
    
            /// <summary>
            /// 简单工厂创建多个对象  
            /// 聚集了矛盾
            /// </summary>
            /// <param name="raceType"></param>
            /// <returns></returns>
            public static IRace CreateRace(RaceType type)
            {
                IRace race = null;
                switch (type)
                {
                    case RaceType.NE:
                        race = new NE();
                        break;
                    case RaceType.ORC:
                        race = new ORC();
                        break;
                    default:
                        throw new Exception("wrong raceType");
                }
                return race;
            }
        }
    

      4.现在,在主函数就可以优雅的调用createRace,实现各路英雄的展示方式

           

      class Program
        {
            static void Main(string[] args)
            {
                IRace man = FactoryObject.CreateRace(RaceType.NE);
                man.ShowKing();
    
                IRace orc = FactoryObject.CreateRace(RaceType.ORC);
                orc.ShowKing();
            }
        }
    

      

    三、优点与缺点

      看完简单工厂模式的实现之后,你和你的小伙伴们肯定会有这样的疑惑,这样我们只是把变化移到了工厂类中罢了,好像没有变化的问题,因为我们还是需要修改工厂类中的方法(也就是多加case语句,没应用简单工厂模式之前,修改的是客户类)。我首先要说:你和你的小伙伴很对,这个就是简单工厂模式的缺点所在(这个缺点后面介绍的工厂方法可以很好地解决)。

         

  • 相关阅读:
    【python小随笔】单例模式设计(易懂版)
    【python小随笔】函数的初始化与私有化
    【python小随笔】List列表的常见函数与切片
    【itsdangerous】的加密解密原理(易懂版)
    【Django入坑之路】Django后台上传图片,以及前端的显示
    【插拔式】分页+bootstrap4(开源)
    luogu P1231 教辅的组成 |网络流最大匹配
    luogu P3376 【模板】网络最大流 |Dinic
    luogu P4177 [CEOI2008]order |最大权闭合子图
    luogu P4562 [JXOI2018]游戏 |组合数学
  • 原文地址:https://www.cnblogs.com/Qxian/p/13706652.html
Copyright © 2020-2023  润新知