c++-简单工厂模式

简介

简单工厂: 工厂是非抽象的,具体
工厂模式: 工厂是抽象的, 且只生成一种产品
抽象工厂: 工厂是抽象的, 且可以生产很多产品,所以他面对于一个问题,如果想要增加一类产品的话, 抽象工厂模式就得修改抽象, 就是对修改不关闭

简单工厂模式

一般简单工厂模式的缺点是:当需要增加新的产品时, 需要修改工厂代码,这是对修改不关闭的

好的设计模式应该是对扩展开放, 对修改关闭

下面使用一种注册的模式,来规避该缺点。

#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 Pizza {
 public:
    void bake() {
        cout << name << "::bake" << endl;
    }

    void cut() {
        cout << name << "::cut" << endl;
    }

    virtual ~Pizza() = 0;

    string name;
};

Pizza::~Pizza() {}

class TranditonalPizza : public Pizza {
 public:
    TranditonalPizza() {
        name = "TranditonalPizza";
    }
};

class NewPizza : public Pizza {
 public:
    NewPizza() {
        name = "NewPizza";
    }
};

#define StoreAddNewPizza(obj, name) \
    obj.AddNew<name>(#name)

class PizzaFactory {
 private:
    unordered_map<string, function<unique_ptr<Pizza>()>> canMakeGood;
 public:
    void init() {
        canMakeGood["TranditonalPizza"] = []() {
            return unique_ptr<Pizza>(new TranditonalPizza());
        };
    }

    PizzaFactory() {}

    template<typename Type>
    void NewPizzaLearned(const string &name) {
        canMakeGood[name] = []() {
            return unique_ptr<Pizza>(new Type());
        };
    }

    unique_ptr<Pizza> createPizza(const string &name) {
        if (canMakeGood.count(name) == 0) {
            return nullptr;
        }
        return canMakeGood[name]();
    }
};

class PizzaStore {
 private:
    unique_ptr<PizzaFactory> pf;
 public:
    PizzaStore() : pf(make_unique<PizzaFactory>()) {
        pf->init();
    }

    template<typename T>
    void AddNew(const string &name) {
        pf->template NewPizzaLearned<T>(name);
    }

    unique_ptr<Pizza> orderPizza(const string &name) {
        auto pz = pf->createPizza(name);
        if (!pz) {
            return pz;
        }
        pz->bake();
        pz->cut();
        return pz;
    }
};

int main() {
    // 简单工厂模式
    PizzaStore ps;
    auto pz = ps.orderPizza("TranditonalPizza");
    if (!pz) {
        cout << "sorry, pizza store cannot make this pizza\n";
    }

    pz = ps.orderPizza("NewPizza");
    if (!pz) {
        cout << "sorry, pizza store cannot make this pizza\n";
    }
    // 注册新的 pizza
    StoreAddNewPizza(ps, NewPizza);
    pz = ps.orderPizza("NewPizza");
    if (!pz) {
        cout << "sorry, pizza store cannot make this pizza\n";
    }
}

输出

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。简单工厂模式定义了一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 以下是 C++ 实现简单工厂模式的示例代码: ```cpp #include <iostream> using namespace std; // 抽象产品类 class Product { public: virtual void operation() = 0; }; // 具体产品类 A class ProductA : public Product { public: void operation() { cout << "Product A operation." << endl; } }; // 具体产品类 B class ProductB : public Product { public: void operation() { cout << "Product B operation." << endl; } }; // 工厂类 class Factory { public: // 根据参数返回不同的产品实例 Product* createProduct(string type) { if (type == "A") { return new ProductA(); } else if (type == "B") { return new ProductB(); } else { return NULL; } } }; int main() { Factory* factory = new Factory(); Product* productA = factory->createProduct("A"); Product* productB = factory->createProduct("B"); productA->operation(); productB->operation(); delete productA; delete productB; delete factory; return 0; } ``` 在上面的示例代码中,我们定义了一个抽象产品类 `Product`,它包含了一个纯虚函数 `operation()`,表示产品所能进行的操作。在具体产品类 `ProductA` 和 `ProductB` 中,我们实现了 `operation()` 函数。工厂类 `Factory` 中,我们定义了一个 `createProduct()` 函数,它根据传入的参数 `type` 返回不同的产品实例。在 `main()` 函数中,我们先通过工厂类创建了产品实例,然后调用了它们的 `operation()` 函数。最后,在程序结束时,我们释放了内存。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值