工厂方法模式是什么?

一、定义

工厂方法模式相当于在简单工厂模式中工厂类的再次解耦,也就是说将简单工厂中工厂类分解下去,形成多个子工厂类。因为在工厂方法模式中是一个子类对应一个工厂类,而这些工厂类都实现于一个抽象接口。这相当于是把原本会因为业务代码而庞大的简单工厂类,拆分成了一个个的工厂类,这样代码就不会都耦合在同一个类里了。

 

二、结构图

 

三、代码

1.运算基类


class Operation {
public:
    virtual double getResult(double numberA, double numberB) = 0;
};

2.运算子类

class Add :public Operation {
public:
    double getResult(double numberA, double numberB) {
        return numberA + numberB;
    }
};

class Sub :public Operation {
public:
    double getResult(double numberA, double numberB) {
        return numberA - numberB;
    }
};

class Mul :public Operation {
public:
    double getResult(double numberA, double numberB) {
        return numberA * numberB;
    }
};
class Div :public Operation {
public:
    double getResult(double numberA, double numberB) {
        try {
            if (numberB == 0) {
                cout << "除数不能=0" << endl;
                throw - 1;
            }
        }
        catch (int){
            return -999;
        }
        return numberA / numberB;
    }
};

3.工厂基类

class EasyFactory {
public:
    virtual Operation* createOperation() = 0;
};

4.工厂子类

class AddFactory: public EasyFactory{
public:
    Operation* createOperation() {
        return new Add();
    }
};
class SubFactory : public EasyFactory {
public:
    Operation* createOperation() {
        return new Sub();
    }
};
class MulFactory : public EasyFactory {
public:
    Operation* createOperation() {
        return new Mul();
    }
};
class DivFactory : public EasyFactory {
public:
    Operation* createOperation() {
        return new Div();
    }
};

5.客户端类

int main() {
    
     EasyFactory*  factory1 = new AddFactory();
    Operation* add = factory1->createOperation();
    add->getResult(1,1);
    EasyFactory* factory2 = new SubFactory();
    Operation* sub = factory2->createOperation();
    sub->getResult(1, 1);
    EasyFactory* factory3 = new MulFactory();
    Operation* mul = factory3->createOperation();
    mul->getResult(1, 1);
    EasyFactory* factory4 = new DivFactory();
    Operation* div = factory4->createOperation();
    div->getResult(1, 1);

    if (factory1 != NULL)
     {
         delete factory1;
         factory1 = NULL;
}
    if (factory2 != NULL)
    {
        delete factory2;
        factory2 = NULL;
    }
    if (factory3 != NULL)
    {
        delete factory3;
        factory3 = NULL;
    }
    if (factory4 != NULL)
    {
        delete factory4;
        factory4 = NULL;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值