设计模式之抽象工厂(C++)

1. 作用

抽象工厂:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。核心在于创建一组对象。

2. UML类图

这里写图片描述
参与者:

  • Product:为一类产品声明一个接口。
  • ConreteProduct:定义一个将被相应的具体工厂创建的产品对象。
  • Factory:声明一组创建抽象产品对象的接口操作。
  • ConcreteFactory:实现创建一组对象的接口。

3. 实现

  • 举例:长虹和TCL是两个非常著名的家电牌子,两个厂家都要生产电视机和洗衣机,假设现在两家公司合并了,但是品牌还是独立,用程序实现合并后生产产品的情况。
  • 类图:
    这里写图片描述
    代码:

#include <iostream>

using namespace std;


/*******产品抽象类***********/
/*电视机*/
class Tv
{
public:
    virtual void showMe() = 0;
};

/*洗衣机*/
class Washer
{
public:
    virtual void showMe() = 0;
};

/*******产品具体类***********/
/*长虹电视机*/
class ChangHTv :public Tv
{
public:
    virtual void showMe()
    {
        cout << "长虹牌电视机\n";
    }
};

/*长虹洗衣机*/
class ChangHWasher :public Washer
{
public:
    virtual void showMe()
    {
        cout << "长虹牌洗衣机\n";
    }
};

/*TCL电视机*/
class TCLTv :public Tv
{
public:
    virtual void showMe()
    {
        cout << "TCL牌电视机\n";
    }
};

/*TCL洗衣机*/
class TCLWasher :public Washer
{
public:
    virtual void showMe()
    {
        cout << "TCL牌洗衣机\n";
    }
};


/*******工厂抽象类***********/
class Factory
{
public:
    virtual Tv* CreateTv() = 0;
    virtual Washer* CreateWasher() = 0;
};

/*******具体工厂***********/
/***长虹工厂***/
class ChangHFactory:public Factory
{
public:
    virtual Tv* CreateTv()
    {
        return new ChangHTv;
    }
    virtual Washer* CreateWasher()
    {
        return new ChangHWasher;
    }
};

/***TCL工厂***/
class TCLFactory :public Factory
{
public:
    virtual Tv* CreateTv()
    {
        return new TCLTv;
    }
    virtual Washer* CreateWasher()
    {
        return new TCLWasher;
    }
};



/*****客户****/
void main()
{
    //建长虹工厂
    Factory *changhFac = new ChangHFactory;

    //造产品
    Tv *changhTv = changhFac->CreateTv();
    changhTv->showMe();
    Washer *changhWas = changhFac->CreateWasher();
    changhWas->showMe();

    //建TCL工厂
    Factory *tclFac = new TCLFactory;

    //造产品
    Tv *tclFacTv = tclFac->CreateTv();
    tclFacTv->showMe();
    Washer *tclFacWas = tclFac->CreateWasher();
    tclFacWas->showMe();

    delete changhFac;
    delete changhTv;
    delete changhWas;
    delete tclFac;
    delete tclFacTv;
    delete tclFacWas;
}
显示结果:
长虹牌电视机
长虹牌洗衣机
TCL牌电视机
TCL牌洗衣机
请按任意键继续. . .

4. 优缺点

  • 优点:
    封装性:同样将对象的创建过程与使用客户进行了隔离,知道接口就行。
    产品级扩展简单:比如需要增加一个牌子,那么只需增加一个具体工厂即可,抽象工厂不变。
  • 缺点:
    产品族扩展复杂:如果需要在产品族中增加一个产品,比如冰箱,那么需要在抽象工厂和具体工厂中都增加生存冰箱的接口。

PS:产品族和产品级:上述Tv和Washer构成一个产品族,而ChangHong和TCL构成一个产品级,具体感觉需要自己体会。

5. 适用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。这里的约束可以理解为:Tcl厂生产出来的TV和Washer肯定是TCL牌的,而长虹厂生产出的TV和Washer肯定是长虹牌的。品牌就是对具体产品的约束。

6. 总结

抽象工厂是工厂模式的升级版,工厂模式解决了一种对象的创建问题(产品类只有一个抽象类),而抽象工厂解决了一组对象的创建问题,有多少产品抽象类工厂抽象类中就有多少个抽象工厂方法。

猜你喜欢

转载自blog.csdn.net/a369189453/article/details/81043837