简单工厂模式
工厂模式是最常用的设计模式之一,属于创建型设计模式。通过创建不同的子类,具体的逻辑在子类中。
- 典型例子:实现简单的加、减、乘、除的计算
上图是利用VS类设计工具绘制的UML类图,OperationFactory负责创建,OperationAdd、OperationSub、OperationMul、OperationDiv分别对应加、减、乘、除的具体计算逻辑,他们都继承自Operation基类。后期扩展需要其他运算方法时只需要添加对应的计算类然后修改OperationFactory中的创建方法即可。
- Operation基类实现
public abstract class Operation
{
public double NumberA = 0;
public double NumberB = 0;
public virtual double GetResult()
{
return 0;
}
}
- Operation派生计算类
public class OperationAdd : Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
public class OperationSub : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
public class OperationMul : Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
}
public class OperationDiv : Operation
{
public override double GetResult()
{
if (NumberB == 0)
{
return 0;
}
return NumberA / NumberB;
}
}
- OperationFactory工厂类
public class OperationFactory
{
public static Operation operation;
public static Operation CreateOperate(string operate)
{
operation = null;
switch (operate)
{
case "+": operation = new OperationAdd(); break;
case "-": operation = new OperationSub(); break;
case "*": operation = new OperationMul(); break;
case "/": operation = new OperationDiv(); break;
}
return operation;
}
}
- 程序调试入口
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var operation = OperationFactory.CreateOperate("*");
operation.NumberA = 30;
operation.NumberB = 50;
Console.WriteLine(operation.GetResult());
}
}
通过CreateOperate方法创建不同的计算方法,入口处不关心具体实现逻辑
通过简单工厂模式我们可以很方便的扩展程序功能,但是当类似的业务逻辑大量增加时会使系统的类成倍的增加,一定程度上增加了系统的复杂度。
策略模式
在策略模式中,一个类的行为或算法可以在运行时更改。本质上策略模式和简单工厂模式十分类似,策略模式将工厂方法封装于策略对象中,策略对象改变改变对象的执行算法。如下图类结构所示,将上述例子中的简单计算器用策略模式改写一下。
核心类的StrategyCalculate的改动情况:
public class StrategyCalculate
{
private StrategyOperation strategy;
public StrategyCalculate(string operation)
{
switch (operation)
{
case "+": strategy = new StrategyAdd(); break;
case "-": strategy = new StrategySub(); break;
case "*": strategy = new StrategyMul(); break;
case "/": strategy = new StrategyDiv(); break;
}
}
public StrategyOperation Strategy
{
get
{
return strategy;
}
}
public double Calculte(double a, double b)
{
return Strategy.GetResult(a,b);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
StrategyCalculate calculate = new StrategyCalculate("+");
Console.WriteLine(calculate.Calculte(50, 13));
}
}
对比简单工厂模式和策略模式发现其实两种设计模式极为类似,都是通过封装了不同功能的方法来实现程序上的解耦,但是这两种设计模式都存在一个问题,不管是将方法封装到工厂类、还是策略选择类中都不可避免的使用switch方法来选择策略。