工厂模式是使用的最为频繁的一个模式
其具体表现就如其名一样,给予程序员所需要的产品。
给出个常见场景,例如要实现一个返回 不同计算方式 的工厂类
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
差异体现出来了