设计模式–抽象工厂模式
思路
设计一系列的后续需要使用的接口,后面只需要实现接口即可。
优点
1.解耦状态和行为:客户端不需要知道具体产品类的名称,只需要知道抽象工厂和抽象产品的接口。这样可以降低客户端与具体产品类之间的耦合度,使得系统更容易维护和扩展。
2.可维护性和可扩展性:当需要增加一种新的产品系列时,可以创建一个新的具体工厂类来实现抽象工厂接口。这个新的具体工厂负责创建新的产品系列中的各个产品。
3.可复用性:工厂类、产品类都可以封装起来,在其他项目中使用。
设计
一个工厂可以创建一组相关的产品。但不同工厂之间的产品应该是相似的,都是由同一个抽象产品实现来的。
比如有两个品牌的文具厂1和2。他们都能生产橡皮和铅笔。
#include <iostream>
// 抽象产品:铅笔
class AbstractPencil {
public:
virtual void draw() = 0;
};
// 具体产品:普通铅笔
class NormalPencil : public AbstractPencil {
public:
void draw() override {
std::cout << "Normal pencil is drawing." << std::endl;
}
};
// 具体产品:彩色铅笔
class ColorPencil : public AbstractPencil {
public:
void draw() override {
std::cout << "Color pencil is drawing." << std::endl;
}
};
// 抽象产品:橡皮
class AbstractEraser {
public:
virtual void erase() = 0;
};
// 具体产品:普通橡皮
class NormalEraser : public AbstractEraser {
public:
void erase() override {
std::cout << "Normal eraser is erasing." << std::endl;
}
};
// 具体产品:卡通橡皮
class CartoonEraser : public AbstractEraser {
public:
void erase() override {
std::cout << "Cartoon eraser is erasing." << std::endl;
}
};
// 抽象工厂
class AbstractFactory {
public:
virtual AbstractPencil* createPencil() = 0;
virtual AbstractEraser* createEraser() = 0;
};
// 具体工厂 1
class Factory1 : public AbstractFactory {
public:
AbstractPencil* createPencil() override {
return new NormalPencil();
}
AbstractEraser* createEraser() override {
return new NormalEraser();
}
};
// 具体工厂 2
class Factory2 : public AbstractFactory {
public:
AbstractPencil* createPencil() override {
return new ColorPencil();
}
AbstractEraser* createEraser() override {
return new CartoonEraser();
}
};
int main() {
AbstractFactory* factory1 = new Factory1();
AbstractPencil* pencil1 = factory1->createPencil();
AbstractEraser* eraser1 = factory1->createEraser();
pencil1->draw();
eraser1->erase();
delete pencil1;
delete eraser1;
delete factory1;
AbstractFactory* factory2 = new Factory2();
AbstractPencil* pencil2 = factory2->createPencil();
AbstractEraser* eraser2 = factory2->createEraser();
pencil2->draw();
eraser2->erase();
delete pencil2;
delete eraser2;
delete factory2;
return 0;
}
在创建1号工厂后,就可以生产里面的普通铅笔和普通橡皮了。有了铅笔橡皮可以进行写字、擦除操作。
为了挤占市场,市面上又多了一个3号工厂的话,它为了创新,生产了可以更换笔芯的自动铅笔和更好用的高级橡皮。那么这时候只需要创建一个具体的3号工厂和具体产品A3(自动铅笔)和具体产品B3(高级橡皮)即可,无需修改其他已经完成的代码。