C++ 工厂模式示例

本文探讨了C++中的三种工厂模式——简单工厂模式、工厂方法模式和抽象工厂模式,通过实例展示了每种模式的执行结果,旨在帮助读者深入理解设计模式在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 参考 https://blog.youkuaiyun.com/u012156116/article/details/80857255

1、简单工厂模式
#include <iostream>
#include <map>
using namespace std;

class IPerson
{
public:
    virtual void printRole(){}
    static IPerson* create();
};

class TSaler:IPerson
{
public:
    virtual void printRole()
    {
        cout << "I'm a Saler." << endl;
    }
    static IPerson* create()
    {
        TSaler *pstSaler = new TSaler();        
        return (IPerson*)pstSaler;
    }
};

class TBuyer:IPerson
{
public:
    virtual void printRole()
    {
        cout << "I'm a Buyer." << endl;
    }
    static IPerson* create()
    {
        TBuyer *pstBuyer = new TBuyer();  
        return (IPerson*)pstBuyer;
    }
};

enum ROLE_E
{
    ROLE_SALER,
    ROLE_BUYER,
    ROLE_BUTT
};

const map<ROLE_E, IPerson*> g_personTable = {
    {ROLE_SALER, TSaler::create()},
    {ROLE_BUYER, TBuyer::create()}
};

class EasyFactory
{
public:
    static IPerson* createRole(ROLE_E role)
    {
        map<ROLE_E, IPerson*>::const_iterator itr = g_personTable.begin();
        for (; itr != g_personTable.end(); itr++)
        {
            if (role == itr->first)
            {
                return itr->second;
            }
        }
        return nullptr;
    }
};


int main()
{
    cout << "enter" << endl;

    IPerson *pstSaler = EasyFactory::createRole(ROLE_SALER);
    if (nullptr != pstSaler)
    {
        pstSaler->printRole();
        delete pstSaler;
        pstSaler = nullptr;
    }
    else
    {
        cout << "create saler failed." << endl;
    }

    IPerson *pstBuyer = EasyFactory::createRole(ROLE_BUYER);
    if (nullptr != pstBuyer)
    {
        pstBuyer->printRole();
        delete pstBuyer;
        pstBuyer = nullptr;
    }
    else
    {
        cout << "create buyer failed." << endl;
    }

    cout << "exit" << endl;
    return 0;
}

执行结果

PS E:\workspace\sample\Factory> g++ .\EasyFactory.cpp
PS E:\workspace\sample\Factory> ./a
enter
I'm a Saler.
I'm a Buyer.
exit
2、工厂方法模式
#include <iostream>
using namespace std;

class IPerson
{
public:
    virtual void printRole(){}
};

class TSaler:IPerson
{
public:
    virtual void printRole()
    {
        cout << "I'm a Saler." << endl;
    } 
};

class TBuyer:IPerson
{
public:
    virtual void printRole()
    {
        cout << "I'm a Buyer." << endl;
    }  
};

class IFactory
{
public:
    virtual IPerson* createRole(){return nullptr;}
    static IFactory* create();
};

class TSalerFactory
{
public:
    virtual IPerson* createRole()
    {
        TSaler *pstSaler = new TSaler();
        return (IPerson*)pstSaler;
    }
    static IFactory* create()
    {
        TSalerFactory *pstFactory = new TSalerFactory();
        return (IFactory*)pstFactory;
    }
};

class TBuyerFactory
{
public:
    virtual IPerson* createRole()
    {
        TBuyer *pstBuyer = new TBuyer();
        return (IPerson*)pstBuyer;
    }    
    static IFactory* create()
    {
        TBuyerFactory *pstFactory = new TBuyerFactory();
        return (IFactory*)pstFactory;
    }
};

int main()
{
    cout << "enter" << endl;

    IFactory *pstSalerFactory = TSalerFactory::create();
    if (nullptr == pstSalerFactory)
    {
        cout << "new saler factory failed." << endl;
        return -1;
    }

    IPerson *pstSaler = pstSalerFactory->createRole();
    if (nullptr == pstSaler)
    {
        cout << "new saler failed." << endl;
        delete pstSalerFactory;
        pstSalerFactory = nullptr;
        return -1;
    }
    pstSaler->printRole();
    delete pstSaler;
    delete pstSalerFactory;
    pstSaler = nullptr;
    pstSalerFactory = nullptr;

    IFactory *pstBuyerFactory = TBuyerFactory::create();
    if (nullptr == pstBuyerFactory)
    {
        cout << "new buyer factory failed." << endl;
        return -1;
    }

    IPerson *pstBuyer = pstBuyerFactory->createRole();
    if (nullptr == pstBuyer)
    {
        cout << "new buyer failed." << endl;
        delete pstBuyerFactory;
        pstBuyerFactory = nullptr;
        return -1;
    }
    pstBuyer->printRole();
    delete pstBuyer;
    delete pstBuyerFactory;
    pstBuyer = nullptr;
    pstBuyerFactory = nullptr;

    cout << "exit" << endl;
    return 0;
}

执行结果

PS E:\workspace\sample\Factory> g++ .\FactoryMethod.cpp
PS E:\workspace\sample\Factory> ./a
enter
I'm a Saler.
I'm a Buyer.
exit
3、抽象工厂模式
#include <iostream>
using namespace std;

class IPerson
{
public:
    virtual void printRole(){}
};

class TSaler:IPerson
{
public:
    virtual void printRole()
    {
        cout << "I'm a Saler." << endl;
    } 
};

class IProduct
{
public:
    virtual void printName(){}
};

class TBeer:IProduct
{
public:
    virtual void printName()
    {
        cout << "A dozen of beer." << endl;
    }
};

class IFactory
{
public:
    virtual IPerson* createRole(){return nullptr;}
    virtual IProduct* createProduct(){return nullptr;}
    static IFactory* create();
};

class TShopFactory
{
public:
    virtual IPerson* createRole()
    {
        TSaler *pstSaler = new TSaler();
        return (IPerson*)pstSaler;
    }

    virtual IProduct* createProduct()
    {
        TBeer *pstBeer = new TBeer();
        return (IProduct*)pstBeer;
    }

    static IFactory* create()
    {
        TShopFactory *pstFactory = new TShopFactory();
        return (IFactory*)pstFactory;
    }
};


int main()
{
    cout << "enter" << endl;

    IFactory *pstShopFactory = TShopFactory::create();
    if (nullptr == pstShopFactory)
    {
        cout << "create factory failed." << endl;
        return -1;
    }

    IPerson *pstSaler = pstShopFactory->createRole();
    if (nullptr == pstSaler)
    {
        delete pstShopFactory;
        pstShopFactory = nullptr;
        cout << "create saler failed." << endl;
        return -1;
    }
    pstSaler->printRole();
    delete pstSaler;
    pstSaler = nullptr;

    IProduct *pstBeer = pstShopFactory->createProduct();
    if (nullptr == pstBeer)
    {
        delete pstShopFactory;
        pstShopFactory = nullptr;
        cout << "create beer failed." << endl;
        return -1;
    }
    pstBeer->printName();
    delete pstBeer;
    pstBeer = nullptr;

    delete pstShopFactory;
    pstShopFactory = nullptr;

    cout << "exit" << endl;
    return 0;
}

执行结果

PS E:\workspace\sample\Factory> g++ .\AbstractFactroy.cpp
PS E:\workspace\sample\Factory> ./a
enter
I'm a Saler.
A dozen of beer.
exit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值