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

差异体现出来了

原文地址:https://www.cnblogs.com/suriyel/p/2193610.html