1. 什么是抽象工厂模式?
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式的本质:选择产品簇的实现。
工厂方法模式和简单工厂模式关注的是单个产品对象的创建,而抽象工厂模式是创建一系列的产品对象,而这一系列的对象之间是有约束的。
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口,抽象工厂更像是一个产品系列或产品簇,在切换一个产品簇的时候,只要提供不同的抽象工厂实现就可以了,也就是说以产品簇作为一个整体被切换。
如果抽象工厂里面只定义了一个方法,直接创建产品,那么就退化为了工厂方法了。
举例:造有动作的小人
只造有颜色的小人还不行,不会动便没有灵魂;
给这些小人加上动作,分为是唱歌和跳舞;
这两个就构成了动作类,那么在抽象工厂中,不止需要造小人,还需要设置动作类;
即:
class Toy//小人
{
public:
virtual void Show() = 0;
};
class RedToy : public Toy//红色小人
{
public:
virtual void Show() override
{
cout << "我是小红人,我最爱红色, ";
}
};
class BlueToy : public Toy//蓝色小人
{
public:
virtual void Show() override
{
cout << "我是小蓝人,我最爱蓝色, ";
}
};
class Action//动作
{
public:
virtual void Show() = 0;
};
class SingAction : public Action//唱歌
{
public:
virtual void Show()
{
cout << "我还会唱歌" << endl;
}
};
class DanceAction : public Action//跳舞
{
public:
virtual void Show()
{
cout << "我还会跳舞" << endl;
}
};
class AbstractFactory//抽象工厂
{
public:
virtual Toy* CreateToy() = 0;
virtual Action* CreateAction() = 0;
};
class FactorySingAndRed : public AbstractFactory// 唱歌的小红人
{
public:
virtual Toy* CreateToy() override
{
return new RedToy();
}
virtual Action* CreateAction() override
{
return new SingAction();
}
};
class FactoryDanceAndBlue : public AbstractFactory//跳舞的小蓝人
{
public:
virtual Toy* CreateToy() override
{
return new BlueToy();
}
virtual Action* CreateAction() override
{
return new DanceAction();
}
};
int main()
{
shared_ptr<AbstractFactory> FSR(new FactorySingAndRed()); //造唱歌的红色小人流水线
shared_ptr<Toy> FSRT1(FSR->CreateToy());
shared_ptr<Action> FSRA1(FSR->CreateAction());
FSRT1->Show();
FSRA1->Show();
shared_ptr<AbstractFactory> FDB(new FactoryDanceAndBlue()); //造跳舞的蓝色小人流水线
shared_ptr<Toy> FDBT1(FDB->CreateToy());
shared_ptr<Action> FDBA1(FDB->CreateAction());
FDBT1->Show();
FDBA1->Show();
return 0;
}
main函数调用中,通过实例化每条造合适动作和小人的流水线就能创建出带有动作的小人。
2. 抽象工厂模式的优缺点
优点:
- 分离接口和实现:客户端使用抽象工厂来创建需要的对象,而客户端根本不知道具体的实现对象是谁,客户端只是面向产品的接口编程,则客户端从具体的产品实现中解耦;
- 产品簇切换变得容易:客户端选用不同的工厂(流水线)实现,就相当于在切换不同的产品簇,增加产品簇时,只需要新增工厂(流水线)即可;
缺点:
- 不容易扩展新的产品:如果需要给产品簇增加新产品,那么就需要修改抽象工厂,这样会导致修改所有的工厂实现类;
- 容易造成类层次复杂:如果需要选择的层过多,那么会造成整个类层次变得复杂。
3. 何时选用抽象工厂模式?
- 一个系统只知道产品的接口,而不关心实现的时候;
- 可以动态的切换产品簇的时候;
- 如果强调一系列相关产品的接口,以便联合使用。
4. 抽象工厂模式和其它相关模式
- 抽象工厂模式和工厂方法模式:
这两个模式既有联系,也有区别,可以组合使用;
工厂方法模式一般是对单个产品对象的创建,而抽象工厂模式注重产品簇对象的创建;
如果抽象工厂模式只有一个产品的时候,那么就退化为了工厂方法模式,而工厂方法模式又可以退化为简单工厂;
- 抽象工厂模式和单例模式:
这两个模式可以组合使用,在抽象工厂模式里面,具体工厂(流水线)的实现,在整个应用中,通常一个系列的产品只需要一个实例就可以了,因此可以把具体的工厂(流水线)实现为单例模式。