ڼС
梦回起点
做你害怕做的事,你会发现:不过如此
本站基于WordPress—主题by 设计窝
冀ICP备15003737号
梦回起点
Copyright © 2015-2024 All rights reserved.

抽象工厂模式——大话设计模式读书笔记

抽象工厂模式(Abstratct Factory):提供一个创建一系列相关或相互依赖的对象的接口,而无需指它们具体的类。

下面是抽象工厂模式的UML图:

抽象工厂模式

下面是C++实现的代码:

/*
* initm.com
* 作者:Stupid
* 时间:2017-10-30 20:58
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为抽象工厂模式的基本结构代码。
*/
#include <QCoreApplication>
#include <cstdlib>
#include <iostream>

class AbstractProductA
{
public:
    virtual void printType()=0;
};

class ProductA1: public AbstractProductA
{
public:
    void printType()override final{
        std::cout << "ProductA1" << std::endl;
    }
};

class ProductA2: public AbstractProductA
{
public:
    void printType()override final{
        std::cout << "ProductA2" << std::endl;
    }
};

class AbstractProductB
{
public:
    virtual void printType() = 0;
};

class ProductB1: public AbstractProductB
{
public:
    void printType()override final{
        std::cout << "ProductB1" << std::endl;
    }
};

class ProductB2: public AbstractProductB
{
public:
    void printType()override final{
        std::cout << "ProductB2" << std::endl;
    }
};

class AbstractFactory
{
public:
    virtual AbstractProductA* CreateProductA() = 0;
    virtual AbstractProductB* CreateProductB() = 0;
};

class ConcreteFactory1: public AbstractFactory
{
public:
    AbstractProductA* CreateProductA()override final{
        return new ProductA1;
    }
    AbstractProductB* CreateProductB()override final{
        return new ProductB1;
    }
};

class ConcreteFactory2: public AbstractFactory
{
public:
    AbstractProductA* CreateProductA()override final{
        return new ProductA2;
    }
    AbstractProductB* CreateProductB()override final{
        return new ProductB2;
    }
};

int main(int argc, char *argv[])
{
    system("chcp 65001");
    QCoreApplication a(argc, argv);

    AbstractFactory* pFactory = new ConcreteFactory1;
    AbstractProductA* pProductA = pFactory->CreateProductA();
    pProductA->printType();
    AbstractProductB* pProductB = pFactory->CreateProductB();
    pProductB->printType();

    return a.exec();
}

抽象工厂模式可以说是相当符合开放封闭原则了,书中还用了C#中的反射,在C++中没有反射,那么我们可以通过预编译指令来实现类似的功能。

2017-10-30
                         
暂无评论

发表回复