(4条消息) 工厂搬砖也要带脑壳!Jungle学抽象工厂模式_冯Jungle的个人博客-CSDN博客
抽象工厂模式结构
抽象工厂模式结构与工厂方法模式结构类似,不同之处在于,一个具体工厂可以生产多种同类相关的产品:
- 抽象工厂(AbstractFactory) :所有生产具体产品的工厂类的基类,提供工厂类的公共方法;
- 具体工厂(ConcreteFactory) :生产具体的产品
- 抽象产品(AbstractProduct) :所有产品的基类,提供产品类的公共方法
- 具体产品(ConcreteProduct) :具体的产品类
抽象工厂模式UML类图如下:
结合抽象工厂模式定义和UML,可以看到具体工厂ConcreteFactory_A可以生产两种产品,分别是ConcreteProduct_A_1和ConcreteProduct_A_2,另一个具体工厂ConcreteFactory_B同理。客户端使用时,需要声明一个抽象工厂AbstractFactory和两个抽象产品AbstractProduct。
3.抽象工厂模式代码实例
考虑这样一个场景,如下图:
Jungle想要进行户外运动,它可以选择打篮球和踢足球。但这次Jungle不想弄脏原本穿的T恤,所以Jungle还需要穿球衣,打篮球就穿篮球衣,踢足球就穿足球衣。篮球保管室可以提供篮球和篮球衣,足球保管室可以提供足球和足球衣。Jungle只要根据心情去某个保管室,就可以换上球衣、拿上球,然后就可以愉快地玩耍了。
对应的UML实例图如下图:
3.1.定义产品类
3.1.1.产品类Ball
- 抽象产品类*AbstractBall, *球类的基类,定义抽象方法play
//抽象产品类AbstractBall
class AbstractBall
{
public:
AbstractBall(){}
//抽象方法:
void play(){};
};
- 具体产品类, 分别为Basketball和Football,具体实现方法play
//具体产品类Basketball
class Basketball :public AbstractBall
{
public:
Basketball(){
play();
}
//具体实现方法
void play(){
printf("Jungle play Basketball\n\n");
}
};
//具体产品类Football
class Football :public AbstractBall
{
public:
Football(){
play();
}
//具体实现方法
void play(){
printf("Jungle play Football\n\n");
}
};
3.1.2.产品类Shirt
- 抽象产品类*AbstractShirt: *球衣类的基类,定义抽象方法wearShirt
//抽象产品类AbstractShirt
class AbstractShirt
{
public:
AbstractShirt(){}
//抽象方法:
void wearShirt(){};
};
- 具体产品类BasketballShirt和FootballShirt,具体实现方法wearShirt
//具体产品类BasketballShirt
class BasketballShirt :public AbstractShirt
{
public:
BasketballShirt(){
wearShirt();
}
//具体实现方法
void wearShirt(){
printf("Jungle wear Basketball Shirt\n\n");
}
};
//具体产品类FootballShirt
class FootballShirt :public AbstractShirt
{
public:
FootballShirt(){
wearShirt();
}
//具体实现方法
void wearShirt(){
printf("Jungle wear Football Shirt\n\n");
}
};
3.2.定义工厂类
- 定义抽象工厂AbstractFactory,声明两个方法getBall和getShirt
//抽象工厂类
class AbstractFactory
{
public:
virtual AbstractBall *getBall() = 0;
virtual AbstractShirt *getShirt() = 0;
};
- 定义具体工厂BasketballFactory和FootballFactory,重新具体实现两个方法getBall和getShirt
//具体工厂类BasketballFactory
class BasketballFactory :public AbstractFactory
{
public:
BasketballFactory(){
printf("BasketballFactory\n");
}
AbstractBall *getBall(){
printf("Jungle get basketball\n");
return new Basketball();
}
AbstractShirt *getShirt(){
printf("Jungle get basketball shirt\n");
return new BasketballShirt();
}
};
//具体工厂类BasketballFactory
class FootballFactory :public AbstractFactory
{
public:
FootballFactory(){
printf("FootballFactory\n");
}
AbstractBall *getBall(){
printf("Jungle get football\n");
return new Football();
}
AbstractShirt *getShirt(){
printf("Jungle get football shirt\n");
return new FootballShirt();
}
};
3.3.客户端使用方法示例
#include <iostream>
#include "AbstractFactory.h"
int main()
{
printf("抽象工厂模式\n");
//定义工厂类对象和产品类对象
AbstractFactory *fac = NULL;
AbstractBall *ball = NULL;
AbstractShirt *shirt = NULL;
fac = new BasketballFactory();
ball = fac->getBall();
shirt = fac->getShirt();
fac = new FootballFactory();
ball = fac->getBall();
shirt = fac->getShirt();
system("pause");
return 0;
}