zoukankan      html  css  js  c++  java
  • Dic实现工厂模式

    工厂模式是使用的最为频繁的一个模式

    其具体表现就如其名一样,给予程序员所需要的产品。

    给出个常见场景,例如要实现一个返回 不同计算方式 的工厂类

    public static Operation createOperation(string operate)

    {

     //计算类的父类

      Operation oper=null;

      switch(operate)

       {

              case "+":

              oper=new OperationAdd();

              break;

              case"-":

              oper=new OperationSub();

              break;

        }

     return oper;

    }

    其实工厂类要做的

    1,解耦,将运算方式抽象出来。

    2,选择返回类型,将程序员想要的运算方式返回回去。

    如此这般,让我想到了Dic

    可以这么写

        public static Dictionary<string, Operation> dic = new Dictionary<string, Operation>{
                    {"+",OperationAdd},
                    {"-",OperationSub}
                };

       或者索性直接用Func

      Dictionary<string, Func<int, int, int>> dic = new Dictionary<string, Func<int, int, int>>(){

                    {"+",add},

                    {"-",Sub}

                };

    add和Sub可以直接放到一个类中,如果要扩展可以用 partial 将该类写在多个文件中。

    而且Dic有索引,在逻辑实现中,应该比工厂+多态继承效率高(未经验证,求小白鼠)。

    为了求证2者的效率

    写了如下代码

    add1,add2,sub1,sub2对应相关的计算方式

                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (long i = 0; i < 999999999; i++)
                {
                    string s = "";
                    switch (i % 4)
                    {
                        case 0:
                            s = "add1";
                            break;
                        case 1:
                            s = "sub1";
                            break;
                        case 2:
                            s = "add2";
                            break;
                        case 3:
                            s = "sub2";
                            break;
                    }
                    //Dic方法
                    //long result = dic[s](100, 200);
                    //工程方法
                    long result = OperatorFac.GetOperator(s).operatorway(200, 100);
                }

    循环计算999999999次
    采用dic耗时
    00:01:22.7635737
    采用工厂耗时
    00:01:28.9100815

    但可能是计算方式的个数不多,dic的索引还是工程类的switch的优劣区分不是很明显。

    这次增加选择的计算方式个数

    同样的999999999循环
    但是选择增加到了19个
      Stopwatch watch = new Stopwatch();
                watch.Start();
                for (long i = 0; i < 999999999; i++)
                {
                    string s = "";
                    switch (i % 18)
                    {
                        case 0:
                            s = "add1";
                            break;
                        case 1:
                            s = "add2";
                            break;
                        case 2:
                            s = "add3";
                            break;
                        case 3:
                            s = "add4";
                            break;
                        case 4:
                            s = "add5";
                            break;
                        case 5:
                            s = "add6";
                            break;
                        case 6:
                            s = "add7";
                            break;
                        case 7:
                            s = "add8";
                            break;
                        case 8:
                            s = "add9";
                            break;
                        case 9:
                            s = "add10";
                            break;
                        case 10:
                            s = "add11";
                            break;
                        case 11:
                            s = "add12";
                            break;
                        case 12:
                            s = "add13";
                            break;
                        case 13:
                            s = "add14";
                            break;
                        case 14:
                            s = "add15";
                            break;
                        case 15:
                            s = "add16";
                            break;
                        case 16:
                            s = "add17";
                            break;
                        case 17:
                            s = "add18";
                            break;
                        case 18:
                            s = "add19";
                            break;
                    }
                    //Dic方法
                    long result = dic[s](100, 200);
                    //工程方法
                    //long result = OperatorFac.GetOperator(s).operatorway(200, 100);
                }
                watch.Stop();

    switch选择方式
    + Elapsed {00:02:11.9909052} System.TimeSpan
    索引方式
    + Elapsed {00:01:31.8332575} System.TimeSpan

    差异体现出来了

  • 相关阅读:
    数据库系统概论习题集 第八章 数据库并发控制
    数据库系统概论习题集 第七章 数据库恢复技术
    数据库系统概论习题集 第六章 数据库设计
    数据库系统概论习题集 第五章 关系数据理论
    数据库系统概论习题集 第四章 关系系统及其优化
    数据库系统概论习题集 第三章 SQL语言
    【转载】【笔记】vue-router之路由传递参数
    【Dos】复制指定文件夹下所有文件到另外指定文件夹下
    【转载】Vue.js 安装及其环境搭建
    【转载】解决:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • 原文地址:https://www.cnblogs.com/suriyel/p/2193610.html
Copyright © 2011-2022 走看看