定义 用单独一个类来创建具体实例的过程。
类型 创建型模式
特点 使用工厂可以减少代码的耦合性,使代码的可维护性变高。遇到新的需求时,只要新增一个功能的实现,然后通过工厂将实例构建出来即可。
举例 实现两个数字的计算,运用工厂分别创建计算加、减、乘、除的不同实例。

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

设计模式-简单工厂模式.jpg 接下来我们来具体分析一下这个类图🔻🔻

  • 定义运算类Operation:该类是一个抽象类,拥有NumberANumberB两个属性,代表要计算的两个数字;包含一个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();

运行结果如下🔻 CodeResult.jpg

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