关于简单工厂模式(简单计算器例子)的讨论
下面两段代码第一段是我写的,第二段是书上写的。我有点不明白,第二段比第一段代码好在哪里,第一段有啥不足之处。第一段代码:
public class SimpleFactory
{
public decimal CalResult(decimal number1, decimal number2, string operatorName)
{
decimal result = 0;
switch (operatorName)
{
case "+":
result = CalAdd(number1, number2);
break;
case "-":
result = CalSubtraction(number1, number2);
break;
case "*":
result = CalMultiplicative(number1, number2);
break;
case "/":
result = CalDivision(number1, number2);
break;
}
return result;
}
public decimal CalAdd(decimal number1, decimal number2)
{
decimal result = 0;
result = number1 + number2;
return result;
}
public decimal CalSubtraction(decimal number1, decimal number2)
{
decimal result = 0;
result = number1 - number2;
return result;
}
public decimal CalMultiplicative(decimal number1, decimal number2)
{
decimal result = 0;
result = number1 * number2;
return result;
}
public decimal CalDivision(decimal number1, decimal number2)
{
if (number2 == 0)
{
throw new Exception("除数不能为0。");
}
decimal result = 0;
result = number1 / number2;
return result;
}
}
第二段代码:
简单工厂模式 类 --------------------编程问答-------------------- 这个例子只是想告诉你工厂模式的概念大体是什么。但是单从这个例子来讲,用工厂模式完全是不必要和浪费时间以及加大工作量,所以你有疑问也是正常的。在实际项目中,多数情况下我们不会写一个如此简单的计算器,即使写,也不会运用工厂模式。 --------------------编程问答-------------------- 我的个人理解是,第一种方法,仅仅利用了面向对象的封装,对于继承和多态并没有用到。
class Operation
{
private decimal _numberA = 0;
private decimal _numberB = 0;
public decimal numberA
{
get { return _numberA; }
set { _numberA = value; }
}
public decimal numberB
{
get { return _numberB; }
set { _numberB = value; }
}
public virtual decimal GetResult()
{
decimal result = 0;
return result;
}
}
class OperationAdd : Operation
{
public override decimal GetResult()
{
decimal result = 0;
result = numberA + numberB;
return result;
}
}
class OperationSub : Operation
{
public override decimal GetResult()
{
decimal result = 0;
result = numberA - numberB;
return result;
}
}
class OperationMul : Operation
{
public override decimal GetResult()
{
decimal result = 0;
result = numberA * numberB;
return result;
}
}
class OperationDiv : Operation
{
public override decimal GetResult()
{
decimal result = 0;
if (numberB == 0)
{
throw new Exception("除数不能为0。");
}
result = numberA / numberB;
return result;
}
}
class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
第二种方法全都用到了。 --------------------编程问答--------------------
这只是其中一个。
另外,第二种这张扩展性更好一点,假如现在我要增加一个求模,
第一个还得去修改CalResult,
而第二种,就不必去修改Operation类了
--------------------编程问答--------------------
嗯,确实是这样,从这个例子中,我也简单的理解了 简单工厂模式。
对我这个小例子来说,工作量还不是很大,遇到复杂一点的需求,这种模式确实会加大很多工作量。
貌似又看到了一点,将来维护起来,会方便一点哈。 --------------------编程问答--------------------
嗯,是有这么一点,修改起来更清晰一点。
有点疑问哈,
两种方法都加一个求模的话,
都得修改两个地方,一个是加方法,一个是加类,
而且都得从操作方法中添加 求模的swich --------------------编程问答-------------------- 这样的话,第二种的修改方法比第一种的方法好在哪呢?
工作量的话 都差不多
就好在第二种方法没有修改Operation类吗 --------------------编程问答-------------------- 是在大话模式上看的吗,后面还有几个例子,再看看会理解地比较深 --------------------编程问答--------------------
嗯,好的,继续往下看。 --------------------编程问答-------------------- 个人认为第二中代码的可扩展性好点
对于新引入的operation直接继承即可
补充:.NET技术 , C#