Bootstrap

大话设计模式 | 1 简单工厂模式

》是作者「程杰」通过趣味的场景设置,以诙谐的表达来解读和剖析「面向对象」编程思维和「设计模式」。书中的示例代码是以 .NET 的 C# 语言编写而成。

本文是我对《大话设计模式》的学习系列笔记的第一篇,简单工厂模式。

1. 定义

简单工厂模式 (Simple Factory Pattern),又称为静态工厂方法 (Static Factory Method) 模式,它属于类创建型模式。

对比现实生活中生产产品的工厂,在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,称为「工厂」类。

主要是为解决将「类实例化的操作」与「使用对象的操作」分开,让使用者不需要知道具体参数就可以实例化出所需要的「产品」类。

2. 组成

简单工厂模式主要是由三个角色组成:

  • 「抽象产品」角色,是「具体产品」的父类,用来描述产品的公共接口。

  • 「具体产品」角色,是「工厂」类创建的目标,所有创建的对象都是这个角色的某个具体类的实例。

  • 「工厂」角色,负责实现创建所有实例的内部逻辑,可以被外界调用,根据传入不同参数从而创建不同「具体产品」类的实例。

注:这里将「工厂」类与「抽象产品」类连接,而不是与「具体产品」类连接,因为「工厂」类虽然是需要创建不同「具体产品」类的实例,但「工厂」类只需要知道「抽象产品」类就可以了。(这里还需要更好的理解)

3. 使用步骤

主要包含四步:

4. 实例

《大话设计模式》中,是通过一个计算器为例进行说明的。

创建抽象产品类

创建 的抽象产品类,里面通过 关键字定义了产品的公共接口 。

public class Operation
    {
        ...
        public virtual double getResult()
        {
            double result = 0;
            return result;
        }
    }

创建具体产品类

创建具体产品类(、 等),来继承 的抽象产品类,并实现 方法,来定义要生产的具体产品。

public class OperationAdd : Operation
    {
        public override double getResult()
        {
            double result = 0;
            result = FirstNumber + SecondNumber;
            return result;
        }
    }

    public class OperationSub : Operation
    {
        public override double getResult()
        {
            double result = 0;
            result = FirstNumber + SecondNumber;
            return result;
        }
    }

创建工厂类

创建工厂类 ,并定义静态方法 ,通过传入不同参数来创建不同具体产品类的实例。

public class OperationFactory
    {
        public static Operation createOperator(string inputOperator)
        {
            Operation oper = null;
            switch(inputOperator)
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationSub();
                    break;
               ...
            }
            return oper;
        }
    }

调用工厂类的静态方法

在主函数中,调用工厂类的静态方法 ,并传入参数,如 来创建 这一具体产品类的实例。

class Program
    {
        static void Main(string[] args)
        {
            ...
            Operation oper;
            oper = OperationFactory.createOperator(inputOperator);
            ...
            double result = oper.getResult();
        }
    }

代码参考:

5. 参考

本文严重参考了这两篇文章: