文章目录
一、什么是抽象工厂
相较于简单工厂和普通工厂,抽象工厂最大的不同之处在于,它将产品子类以不同划分依据做分组,例如衣服裤子鞋子是一种分组,各种品牌是另一种分组,它支持将衣服的特性提取出来作为抽象产品,再根据不同的品牌具体化特征,按照不同品牌进行归类,是一种与现实联系更为密切的逻辑抽象,继承关系虽复杂而因对称而清晰。
他的优点在于封装发生了变化,封装了对象创建的具体细节,对添加新的产品组很方便需需修改已有系统,针对接口进行编程而不是针对具体进行编程。需要提供大量接口来创建独具特色的产品。
二、如何实现抽象工厂
- 提供一个抽象产品总特征作为抽象产品根
- 根据抽象产品根发散,产生抽象产品系列,并实现系列产品
- 创建抽象工厂,建立与抽象产品的联系,给出配套产品业务
- 实现抽象工厂的具体业务。
三、具体代码实现
1、抽象产品根
#include<iostream>
using namespace std;
//抽象产品根
class AbsProduct {
public:
virtual ~AbsProduct() {};
virtual void show() = 0;
};
2、产生抽象产品系列和具体产品系列
//比如衣服是抽象产品AbsProduct_A
//那具体产品Series_A1就可以是Nike衣服
//A2可以是360衣服,A3可以是XTEP衣服
class AbsProduct_A:public AbsProduct {
public:
virtual ~AbsProduct_A() {};
void show()override {
cout << "product A" << endl;
}
virtual void func() = 0;
};
class Series_A1 :public AbsProduct_A {
public:
void func() override {
cout << "A1 function" << endl;
}
};
class Series_A2 :public AbsProduct_A {
public:
void func() override {
cout << "A2 function" << endl;
}
};
class Series_A3 :public AbsProduct_A {
public:
void func() override {
cout << "A3 function" << endl;
}
};
//比如裤子是抽象产品AbsProduct_B
//那具体产品Series_B1就可以是Nike裤子
//B2可以是360裤子,B3可以是XTEP裤子
class AbsProduct_B:public AbsProduct {
public:
~AbsProduct_B() {};
void show() override {
cout << "product B" << endl;
}
virtual void func() = 0;
};
class Series_B1 :public AbsProduct_B {
public:
void func()override {
cout << "B1 function" << endl;
}
};
class Series_B2 :public AbsProduct_B {
public:
void func()override {
cout << "B2 function" << endl;
}
};
class Series_B3 :public AbsProduct_B {
void func()override {
cout << "B3 function" << endl;
}
};
//那么,A1与B1配套,A2与B2配套......
3、一个工厂生产一套产品的抽象
//抽象工厂,可以生产衣服鞋子,那Factory1就是Nike厂,
//Factory2就是360厂,Factory3就是XTEP厂。
class AbsFactory {
public:
virtual ~AbsFactory() {};
virtual AbsProduct_A* createA() = 0;
virtual AbsProduct_B* createB() = 0;
};
4、具体化上面的抽象
class Factory1:public AbsFactory {
AbsProduct_A* createA() override {
return new Series_A1;
}
AbsProduct_B* createB() override{
return new Series_B1;
}
};
class Factory2 :public AbsFactory {
AbsProduct_A* createA() override {
return new Series_A2;
}
AbsProduct_B* createB() override {
return new Series_B2;
}
};
class Factory3 :public AbsFactory {
AbsProduct_A* createA() override {
return new Series_A3;
}
AbsProduct_B* createB() override {
return new Series_B3;
}
};
5、必要时加上用户接口
//还是子类对象初始化父类指针
//用户接口,要什么厂生产就传入什么参数即可。
static void func(int num) {
//确定厂
AbsFactory* pf;
switch (num){
case 1: {
pf = new Factory1();
break;
}
case 2: {
pf = new Factory2();
break;
}
case 3: {
pf = new Factory3();
break;
}
default:pf = nullptr; return;
}
//然后生产逻辑完全一致
AbsProduct_A* pa = pf->createA();
AbsProduct_B* pb = pf->createB();
pa->show(); pa->func();
pb->show(); pb->func();
//避免内存泄漏
pf->~AbsFactory();
pa->~AbsProduct_A();
pb->~AbsProduct_B();
}
6、调用main.cpp
int main() {
func(1);
func(2);
func(3);
func(4);
return 0;
}
四、实现展示
好啦,今天的分享就到这里~