C++常用设计模式之:抽象工厂

无人久伴 提交于 2020-03-07 00:12:07

抽象工厂同样是一种常见的创建型模式,它也是用于解决程序中创建对象使用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图我们再来看看: 

     

结合到我们的例子和抽象工厂的定义,其中稳定的部分就是我们的工厂类和各种各样的电器类。变化的是从前面的类中演化(继承)出来的具体的类。和工厂方法一样,我们也是通过虚函数的方法,把创建具体对象的工作延迟到子类中,不同的是我们创建的一系列的对象,而不是一个单一的对象。

最后,如果理解的有偏差,还请指出!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!