写点什么

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

用户头像
Puran
关注
发布于: 2020 年 06 月 05 日
大话设计模式 | 1 简单工厂模式

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

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

1. 定义

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

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



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

2. 组成

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

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

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

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

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

3. 使用步骤

主要包含四步:

  1. 创建「抽象产品」类,并定义「具体产品」的公共接口;

  2. 创建「具体产品」类,并定义生产的「具体产品」;

  3. 创建「工厂」类,通过创建静态方法,根据传入不同参数来创建不同「具体产品」类的实例;

  4. 外界通过调用「工厂」类的静态方法,传入不同参数,从而创建不同「具体产品」类的实例。



4. 实例

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



创建抽象产品类

创建 Operation 的抽象产品类,里面通过 virtual 关键字定义了产品的公共接口 getResult()

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



创建具体产品类

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

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;
}
}



创建工厂类

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

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;
}
}



调用工厂类的静态方法

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

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





代码参考:https://github.com/puran1218/DesignPatternWithCSharp

5. 参考

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



用户头像

Puran

关注

GIS从业者,正在往开发的路上小跑。 2018.03.29 加入

从业4年的GIS开发小白,work@esri。

评论

发布
暂无评论
大话设计模式 | 1 简单工厂模式