3 创建型模式-----抽象工厂模式

模式动机:工厂方法模式一般针对的是一个产品等级结构(如仅生产电视机),而抽象工厂模式针对的是多个产品等级结构(如不仅生产电视机,还生产空调)。

模式定义:一个具体工厂可以创建一个产品族的所有产品,又称为Kit模式

模式结构图:

模式代码:

bt_抽象工厂模式.h

#ifndef AFP_H
#define AFP_H
#include <iostream>

/*
    抽象产品接口
*/
class AbstractProductA
{
public:
    virtual ~AbstractProductA(){ };
};

class AbstractProductB
{
public:
    virtual ~AbstractProductB(){ };
};

/*
    具体产品类A
*/
class ConcreteProductA1 : public AbstractProductA
{
public:
    ConcreteProductA1();
};
ConcreteProductA1::ConcreteProductA1()
{
    std::cout << "创建产品族1中的A" << std::endl;
}
class ConcreteProductA2 : public AbstractProductA
{
public:
    ConcreteProductA2();
};
ConcreteProductA2::ConcreteProductA2()
{
    std::cout << "创建产品族2中的A" << std::endl;
}

/*
    具体产品类B
*/
class ConcreteProductB1 : public AbstractProductB
{
public:
    ConcreteProductB1();
};
ConcreteProductB1::ConcreteProductB1()
{
    std::cout << "创建产品族1中的B" << std::endl;
}
class ConcreteProductB2 : public AbstractProductB
{
public:
    ConcreteProductB2();
};
ConcreteProductB2::ConcreteProductB2()
{
    std::cout << "创建产品族2中的B" << std::endl;
}


/*
    抽象工厂接口
*/

class AbstractFactory
{
public:
    virtual ~AbstractFactory(){ };
    virtual AbstractProductA* createProductA() = 0;
    virtual AbstractProductB* createProductB() = 0;
};

/*
    具体工厂ConcreteFactory1负责生产 "产品族1"
*/

class ConcreteFactory1 : public AbstractFactory
{
public:
    virtual AbstractProductA* createProductA();
    virtual AbstractProductB* createProductB();
};
AbstractProductA* ConcreteFactory1::createProductA()
{
    return new ConcreteProductA1;
}
AbstractProductB* ConcreteFactory1::createProductB()
{
    return new ConcreteProductB1;
}

/*
    具体工厂ConcreteFactory2负责生产 "产品族2"
*/

class ConcreteFactory2 : public AbstractFactory
{
public:
    virtual AbstractProductA* createProductA();
    virtual AbstractProductB* createProductB();
};
AbstractProductA* ConcreteFactory2::createProductA()
{
    return new ConcreteProductA2;
}
AbstractProductB* ConcreteFactory2::createProductB()
{
    return new ConcreteProductB2;
}
#endif // AFP_H

bt_抽象工厂模式.cpp

#include "bt_抽象工厂模式.h"
#include <iostream>

int main()
{
    std::cout << "***** 抽象工厂模式测试 *****" << std::endl;
    AbstractFactory* factory = NULL;
    AbstractProductA* pa = NULL;
    AbstractProductB* pb = NULL;

    factory = new ConcreteFactory1;
    pa = factory->createProductA();
    pb = factory->createProductB();

    std::cout << std::endl;
    factory = new ConcreteFactory2;
    pa = factory->createProductA();
    pb = factory->createProductB();

    delete pb;
    delete pa;
    delete factory;

    return 0;
}

模式优缺点:

添加新的产品族(即一个新的品牌)比较容易,此时只需要定义新的工厂和产品类即可;但增加产品等级(即原有品牌的种类)比较麻烦,此时必须修改抽象工厂以添加新种类的生产接口,同时所有已有的产品族工厂也要修改,这就违背了“开闭原则”。该模式具体应用中一般适合对象的多种状态同时发生变化时,比如操作系统中的主题管理程序等。

比较:

抽象工厂模式针对的是多个产品等级,而工厂方法模式针对的是一个产品等级,抽象工厂模式经过退化后完全可以变为工厂方法模式,甚至是简单工厂模式。

猜你喜欢

转载自blog.csdn.net/u014725884/article/details/90106015
今日推荐