定义 用单独一个类来创建具体实例的过程。
类型 创建型模式
特点 使用工厂可以减少代码的耦合性,使代码的可维护性变高。遇到新的需求时,只要新增一个功能的实现,然后通过工厂将实例构建出来即可。
举例 实现两个数字的计算,运用工厂分别创建计算加、减、乘、除的不同实例。
本文以C#为例,先来看类图🔻
接下来我们来具体分析一下这个类图🔻🔻
-
定义运算类Operation:该类是一个抽象类,拥有NumberA、NumberB两个属性,代表要计算的两个数字;包含一个GetResult的方法,用于对两个数字进行相应的计算。
-
定义具体的加法类OperationAdd、减法类OperationSub、乘法类OperationMul、除法类OperationDiv:这几个类分别继承自运算类Operation,实现具体的计算逻辑。
-
定义简单工厂类OperationFactory:该类包含一个CreateOperate方法,用于构造计算时所需要具体的运算类。
1
2
3
4
5
6
7
8
9
|
/// <summary>
/// 运算类
/// </summary>
public abstract class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public abstract double GetResult();
}
|
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 加法类
/// </summary>
public class OperationAdd : Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
|
/// <summary>
/// 减法类
/// </summary>
/// <returns></returns>
public class OperationSub : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
|
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 乘法类
/// </summary>
public class OperationMul : Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
}
|
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 除法类
/// </summary>
public class OperationDiv : Operation
{
public override double GetResult()
{
return NumberA / NumberB;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/// <summary>
/// 简单工厂类
/// </summary>
public class OperationFactory
{
public static Operation CreateOperation(string operationType)
{
switch (operationType)
{
case "+":
return new OperationAdd();
case "-":
return new OperationSub();
case "*":
return new OperationMul();
case "/":
return new OperationDiv();
default:
throw new Exception("无效的操作符号");
}
}
}
|
定义完需要的代码后,我们来看具体的使用方式🔻
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//这里只是演示,不做数据类型的校验
Console.WriteLine("请输入第一个数字:");
string numberA = Console.ReadLine();
Console.WriteLine("请输入操作符:");
string operationType = Console.ReadLine();
Console.WriteLine("请输入第二个数字:");
string numberB = Console.ReadLine();
Operation operation = null;
operation = OperationFactory.CreateOperation(operationType);
operation.NumberA = Convert.ToDouble(numberA);
operation.NumberB = Convert.ToDouble(numberB);
double result = operation.GetResult();
Console.WriteLine($"计算结果为:{result}");
Console.ReadLine();
|
运行结果如下🔻

参考资料:
《大话设计模式》