抽象工厂同样是一种常见的创建型模式,它也是用于解决程序中创建对象使用new而产生的紧耦合的问题。那它与之前说到的工厂方法有什么不同呢?工厂方法创建的是一个单一的对象,而使用抽象工厂可以创建一系列对象。
抽象工厂的定义:可以提供向使用者一个接口,这个接口可以创建一系列具有相关性的对象。
结合之前说的工厂方法我们来看看现实中的例子:还是以家电为例,在工厂方法中我们得到了一个具体品牌的家电,在实际生活中某个具体的家电品牌旗下有很多不同的电器,像洗衣机、空调、冰箱等等好几十种。如果还是用工厂方法来解决,也不是不行,那就先为不同的品牌建立不同的工厂,再为不同的电器建立不同的工厂呗,这下工厂可就多了去了........这个时候就该抽象工厂闪亮登场了,噔噔噔...它就是为了解决这样一系列对象(同一个品牌下的不同电器)而生的。那么我们再仔细想一下,是不是工厂方法就是一种特殊的抽象工厂呢,当这一系列对象简化为一个对象时,抽象工厂就变成了工厂方法了。
UML结构图如下:
下面我用伪码来表述上面的例子。
//这里我们为每一种电器创建一个基类,里面具体的内容我就不写了,知道它们是抽象基类就行了
class Washing {...}; //洗衣机
class AirConditioner {...};//空调
class Fridge {...};//冰箱
//这些电器可以使用一个共同的工厂来制造
class IFactory
{
public:
virtual Washing *CreateWashing() = 0;//制造洗衣机
virtual AirConditioner *CreateAirConditioner() = 0;//制造空调
virtual Fridge *CreateFridge() = 0;//制造冰箱
}
//具体到品牌那就是,美的洗衣机,美的空调,美的冰箱
class MideaWashing : public Washing {};
class MideaAirConditioner : public AirConditioner {};
class MideaFridge : public Fridge {};
//美的的工厂
class MideaFactory : public IFactory
{
public:
virtual Washing *CreateWashing() {}//制造美的洗衣机
virtual AirConditioner *CreateAirConditioner() {}//制造美的空调
virtual Fridge *CreateFridge() {}//制造美的冰箱
};
//这里还有格力、海尔、惠而浦等等写法都一样我就不写那么多了
//应用
int main()
{
//这里想要啥工厂就传进来啥工厂吧,这里假设传进的是new MideaFactory();
IFactory * pFactory;
//那么来个美的全家桶吧
Washing *pW = pFactory->CreateWashing();
AirConditioner *pA = pFactory->CreateWashing();
Fridge *pF = pFactory->CreateFridge();
return 0;
}
现在返回那张UML图我们再来看看:
结合到我们的例子和抽象工厂的定义,其中稳定的部分就是我们的工厂类和各种各样的电器类。变化的是从前面的类中演化(继承)出来的具体的类。和工厂方法一样,我们也是通过虚函数的方法,把创建具体对象的工作延迟到子类中,不同的是我们创建的一系列的对象,而不是一个单一的对象。
最后,如果理解的有偏差,还请指出!
来源:CSDN
作者:梦话王子
链接:https://blog.csdn.net/zouyang85457013/article/details/104696600