上一节,介绍简单工厂模式, 并比较了 三种工厂模式的区别
详情参照上文 简单工厂模式
工厂模式
本文将介绍工厂模式
在这种模式下,
工厂将是抽象的, 且一种具体商品 对应一种 工厂
而简单工厂模式则不同,工厂是个具体的,且一个工厂可以生产任意多种具体产品。
工厂模式的好处是 这是一种面向抽象编程方式,我们关心的大部分都是抽象,所以在技术升级的时候所付出代价是很小的。
下面代码的例子来看
在我们进行产品升级的时候,端上可以只修改一行代码,就能完成升级。
还有哪些场景适合呢, 比如我们的数据库相关的程序, 最开始,端上对应的数据库为 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();
}