定义 定义一个创建产品的工厂接口,将实际创建工作推迟到子类中去。
类型 创建型模式
特点 相对于简单工厂模式,将创建的逻辑交给调用者,更加符合闭开原则。
举例 数字计算器。
本文以C#为例,先来看类图🔻

这个模式比较简单,所以直接上代码:
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
|
/// <summary>
/// 抽象工厂
/// </summary>
interface IFactory
{
Operation CreateOperation();
}
|
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 加法工厂
/// </summary>
class FactoryAdd : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
|
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 减法工厂
/// </summary>
class FactorySub : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
|
客户端调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//这里只是演示,不做数据类型的校验
Console.WriteLine("准备加法操作");
Console.WriteLine("请输入第一个数字:");
string numberA = Console.ReadLine();
Console.WriteLine("请输入第二个数字:");
string numberB = Console.ReadLine();
IFactory factory = new FactoryAdd();
Operation operation = factory.CreateOperation();
operation.NumberA = Convert.ToDouble(numberA);
operation.NumberB = Convert.ToDouble(numberB);
double result = operation.GetResult();
Console.WriteLine($"计算结果为:{result}");
// 结果输出:
// 准备加法操作
// 请输入第一个数字:
// 1
// 请输入第二个数字:
// 2
// 计算结果为:3
|
参考资料:
《大话设计模式》