设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
今天学习一个简单的设计模式:简单工厂模式。用这个模式来实现一个简单的计算器。可以实现加减乘除4则运算。
一看这个问题,我们发现问题真的挺简单,基本上学过简单的程序设计的都可以完成。但是要写出一个低耦合、灵活、容易修改、可复用的程序也许就不是那么简单了。
编程是一门技术,更加是一门艺术,不能只满足于写完代码运行结果,时常考虑如何让代码更加简练,更加容易维护,更加扩展与复用,
首先,我们应该用尽可能的方法去避免重复。比如如果要求一个控制台的,要求修改为界面的,如何避免重复?答案是将计算与显示分开。
简单的说,就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降,只有分离开,才可以达到容易维护或拓展。
接下来,我们怎么样让程序更灵活呢?比如加上一个开根号的功能,我们应该把加减乘除等运算分离,修改其中一个不影响另外的集合,增加运算算法也不影响其他代码。
然后,我们如何让计算器知道我是希望用哪一个算法呢?
简单工厂模式:到底要实例化谁,将来会不会找你增加实例化的对象,比如开根对象,这些很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。
源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SimpleFactory
{
//要求使用简单工厂模式,实现一个计算器程序
//简单工厂类
public class OperatorFactory
{
public static Operator createOperator(string operate)
{
Operator oper = null;
switch (operate)
{
case "+":
oper = new OperatorAdd();
break;
case "-":
oper = new OperatorSub();
break;
case "*":
oper = new OperatorMul();
break;
case "/":
oper = new OperatorDiv();
break;
}
return oper;
}
}
//运算类
public class Operator
{
private double numberA = 0;
private double numberB = 0;
public double NumberA
{
get { return numberA; }
set { numberA = value; }
}
public double NumberB
{
get { return numberB; }
set { numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
public class OperatorAdd : Operator
{
public override double GetResult()
{
double result = NumberA + NumberB;
return result;
}
}
public class OperatorSub : Operator
{
public override double GetResult()
{
double result = NumberA - NumberB;
return result;
}
}
public class OperatorMul : Operator
{
public override double GetResult()
{
double result = NumberA * NumberB;
return result;
}
}
public class OperatorDiv : Operator
{
public override double GetResult()
{
if (NumberB == 0)
throw new Exception("除数不能为0");
double result = NumberA / NumberB;
return result;
}
}
class Program
{
//界面
static void Main(string[] args)
{
Operator oper;
oper = OperatorFactory.createOperator("/");
oper.NumberA = 1;
oper.NumberB = 0;
try
{
Console.WriteLine(oper.GetResult());
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
}
}