写在前面的话:最近维护自己的代码的时候经常觉得无从下手,归根到底还是因为写的乱七八糟的,正好给了之前想学但又懒得开始学设计模式的我一个动力。
本次设计模式的全部学习内容均来自于《大话设计模式》这本书(程杰著),这本书用更加通俗易懂的方式介绍了GoF《设计模式》中的23种设计模式,个人觉得还是蛮有意思的~
值得一提的是这本书中的实例均使用C#作为编程语言,但设计模式主要是学思想嘛,所以也不会有太大影响~
设计模式所依赖的核心就是面向对象了,可怜的是虽然我是计算机相关专业毕业,但是大学期间太贪玩了,所以我面向对象的基础还是挺垃圾的,所以在开始设计模式前也有特意去温习了一遍有关于的内容(在这本书的附录A中)
温习完了就开始设计模式学习之旅吧~
第1章 代码无错就是优?【简单工厂模式】
第一章比较入门,提及到很多面向对象编程和面向过程编程的区别。其中介绍了一种模式——简单工厂模式,这种模式并不是23中设计模式中的一种,主要是用来引出面向对象的思想。
下面是通过简单工厂模式实现计算器功能的代码:
首先创建一个Operation类作为父类,子类和父类唯一的区别在于如何运算,子类只需要重写GetResult方法即可
class Operation
{
private double _NumA;
private double _NumB;
public double NumA
{
get { return _NumA; }
set { _NumA = value; }
}
public double NumB
{
get { return _NumB; }
set { _NumB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
四种子运算类继承Operation类(加减乘除)
class OperationAdd : Operation
{
public override double GetResult()
{
double result = base.GetResult();
result = NumA + NumB;
return result;
}
}
class OperationSub : Operation
{
public override double GetResult()
{
double result = base.GetResult();
result = NumA - NumB;
return result;
}
}
class OperationMul : Operation
{
public override double GetResult()
{
double result = base.GetResult();
result = NumA * NumB;
return result;
}
}
class OperationDiv : Operation
{
public override double GetResult()
{
double result = base.GetResult();
if (NumB == 0)
throw new Exception("除数不能为0");
result = NumA / NumB;
return result;
}
}
那么,当需要计算的时候如何选择是哪种计算方法呢?
这时候我们需要创建一个“工厂”类,内部写一个方法来得到对应的运算子类:
class OperationFactory
{
public static Operation createOperate(string operateType)
{
Operation oper = null;
switch (operateType)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
default:
break;
}
return oper;
}
}
最后调用即可:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入第一个数:");
double num_a = double.Parse(Console.ReadLine());
Console.WriteLine("请输入计算的方式:(+ - * /)");
string operate = Console.ReadLine();
Operation oper = OperationFactory.createOperate(operate);//通过工厂创建对应的运算类
Console.WriteLine("请输入第二个数:");
double num_b = double.Parse(Console.ReadLine());
//通过对创建的类的属性赋值和函数调用,得到计算结果
oper.NumA = num_a;
oper.NumB = num_b;
Console.WriteLine("计算结果为:{0}",oper.GetResult());
Console.ReadLine();
}
}
效果如图所示:
github项目源码在此:静态工厂方法——简易计算器