c++-工厂模式

文章目录


上一节,介绍简单工厂模式, 并比较了 三种工厂模式的区别
详情参照上文 简单工厂模式

工厂模式

本文将介绍工厂模式
在这种模式下,
工厂将是抽象的, 且一种具体商品 对应一种 工厂
而简单工厂模式则不同,工厂是个具体的,且一个工厂可以生产任意多种具体产品。

工厂模式的好处是 这是一种面向抽象编程方式,我们关心的大部分都是抽象,所以在技术升级的时候所付出代价是很小的。
下面代码的例子来看
在我们进行产品升级的时候,端上可以只修改一行代码,就能完成升级。
在这里插入图片描述

还有哪些场景适合呢, 比如我们的数据库相关的程序, 最开始,端上对应的数据库为 oracle, 可是后来 oracle 涨价了用不起, 我们打断换 mysql
这时候,如果我们采用工厂模式封装数据库相关代码, 那么这样是不是也能很轻松的完成代码的升级呢!

#include <iostream>
#include <utility>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>

using namespace std;

// 工厂模式: 和 简单工厂的区别在于, 这种情况下  工厂是抽象的
// 且一种具体商品 必须对应一种 工厂
class AbstractPizza {
 public:
    void bake() {
        cout << name() << "::bake" << endl;
    }
    void cut() {
        cout << name() << "::cut" << endl;
    }
    virtual ~AbstractPizza() = 0;

    virtual string name() const = 0;
};
AbstractPizza::~AbstractPizza() {}

class NewPizza : public AbstractPizza {
 public:
    NewPizza() {
    }
    string name() const{
        return "NewPizza";
    }
};

class TranditonalPizza : public AbstractPizza {
 public:
    TranditonalPizza() {
    }
    string name() const{
        return "TranditonalPizza";
    }
};


class AbstractFactory {
 public:
    virtual unique_ptr<AbstractPizza> createPizza() = 0;
};

class NewPizzaFactory : public AbstractFactory {
 public:
    unique_ptr<AbstractPizza> createPizza() override {
        return make_unique<NewPizza>();
    }
};

class TranditonalPizzaFactory : public AbstractFactory {
 public:
    unique_ptr<AbstractPizza> createPizza() override {
        return make_unique<TranditonalPizza>();
    }
};

void pizzaTest() {
    cout << "技术落后的时候" << "******************\n";
    unique_ptr<AbstractFactory> factory = make_unique<TranditonalPizzaFactory>();
    auto pz = factory->createPizza();
    pz->bake();
    pz->cut();

    cout << "技术提升后" << "******************\n";
    factory = make_unique<NewPizzaFactory>();
    pz = factory->createPizza();
    pz->bake();
    pz->cut();

}

// 我们会发现, 在我们进行产品升级时候, 我们唯一就改动了一行代码,这也就是抽象工厂的优点
int main() {
   pizzaTest();
}

输出

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值