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

本文以C#为例,先来看类图🔻

设计模式-工厂方法模式.png

这个模式比较简单,所以直接上代码:

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

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