简单工厂模式

titledatetagscategoriesdescription
简单工厂模式
2020-03-06 05:04:12 -0800
工厂模式
设计模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

面向对象的三大特性:封装,继承和多态

介绍

  • 一般来说,工厂模式需要三个类
  1. 抽象产品类:简单工厂模式中所有对象的父类,负责描述接口
  2. 具体产品类:继承自抽象产品类,是简单工厂模式的创建目标
  3. 工厂类:简单工厂模式的核心,负责判断到底需要实例化谁

实现

假设需要设计一个执行两个数字简单四则运算的程序

抽象产品类

抽象出该程序中公共的内容:两个数字,及其getset方法

//运算基类
class Operation {
public:
    double num1;
    double num2;
    double GetNum1();
    void SetNum1(double num);
    double GetNum2();
    void SetNum2(double num);
    virtual double GetResult() = 0;
    //定义虚析构函数
    virtual ~Operation() { printf("del opera\n"); }
};
//方法的实现
double Operation::GetNum1() { return num1; }
void Operation::SetNum1(double num) { num1 = num; }
double Operation::GetNum2() { return num2; }
void Operation::SetNum2(double num) { num2 = num; }

具体产品类

接下来写出每个运算的具体类

//加法
class Add : public Operation {
public:
    double GetResult();
    ~Add() { printf("deladd\n"); };
};
//减法
class Sub : public Operation {
public:
    double GetResult();
    ~Sub() { printf("delsub\n"); };
};
//乘法
class Mul : public Operation {
public:
    double GetResult();
    ~Mul() { printf("delmul\n"); };
};
//除法
class Div : public Operation {
public:
    double GetResult();
    ~Div() { printf("deldiv\n"); };
};
double Add::GetResult() { return num1 + num2; }
double Sub::GetResult() { return num1 - num2; }
double Mul::GetResult() { return num1 * num2; }
double Div::GetResult() {
    if (num2 == 0)
        throw "除数不能为0";
    return num1 / num2;
}

工厂类

这个类用于判断什么时候实例出哪一个类的对象

//运算简单工厂类
class OperationFactory {
public:
    //提供静态方法
    static Operation* CreateOperation(const char* opearte);
};
Operation* OperationFactory::CreateOperation(const char* opearte) {
    Operation* oper = NULL;
    if (strcmp(opearte, "+") == 0)
        oper = new Add;
    else if (strcmp(opearte, "-") == 0)
        oper = new Sub;
    else if (strcmp(opearte, "*") == 0)
        oper = new Mul;
    else if (strcmp(opearte, "/") == 0)
        oper = new Div;
    return oper;
}

主函数

int main() {
    //由工厂类来判断到底需要创建什么对象
    Operation* oper = OperationFactory::CreateOperation("+");
    oper->SetNum1(10);
    oper->SetNum2(20);
    printf("res=%lf", oper->GetResult());
    //析构
    delete oper;
    return 0;
}

输出

res=30.000000
deladd
del opera

总结

使用简单工厂模式后,更为方便扩展,当需要添加新的运算如次方根等时,需要

  • 添加相应的运算子类
  • 在工厂类中添加新的判断分支 而不需要影响整个代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值