C++ factory 模式

转自: https://blog.csdn.net/woosky_92/article/details/78178555

1. Product: 主要定义工厂方法要创建对象的接口(C++ 中表现为虚函数

2. ConcreteProduct: 实现Product类的接口

3. Factory: 主要声明一个工厂方法,这个方法返回Product类型的对象。这个方法可返回一个缺省实现,返回一个ConcreteProduct对象

4. ConcreteFactory: 主要重定义Factory中工厂方法以返回一个具体的ConcreteProduct对象。

 

有一个产品,它有ABC三个系列,那么这里我们是创建一个Product类,主要来声明统一的接口,然后创建ConcreteProductA、ConcreteProductB、ConcreteProductC类,

它们都继承Product类,这三个类是具体的ABC三个系列产品。

class Product
{
public:
    Product(){};
    virtual ~Product(){};
    virtual void show() = 0;
};
 
class ConcreteProductA:public Product
{
public:
    ConcreteProductA(){};
    virtual ~ConcreteProductA(){};
    virtual void show() override
    {
        printf("ConcreteProductA::show()\n");
    }
};
 
class ConcreteProductB :public Product
{
public:
    ConcreteProductB () {};
    virtual ~ConcreteProductB() {};
    virtual void show() override
    {
        printf("ConcreteProductB::show()\n");
    }
};
 
class ConcreteProductC :public Product
{
public:
    ConcreteProductC(){};
    virtual ~ConcreteProductC (){};
    virtual void show() override
    {
        printf("ConcreteProductC::show()\n");
    }
};
 
typedef enum _ProductID
{
    ProductA,
    ProductB,
    ProductC
}ProductID;
 
class Factory
{
public:
    Factory(){};
    virtual ~Factory(){};
protected:
    virtual Product* CreatProduct(ProductID id)
    {
        switch (id)
        {
        case ProductA:
            return new ConcreteProductA();
        default:
            break;
        }
        return nullptr;
    }
};
 
class ConcreteFactory :public Factory
{
public:
    ConcreteFactory(ProductID id) :m_id(id), m_pProduct(nullptr)
    {
    }
    virtual ~ConcreteFactory()
    {
        if (m_pProduct != nullptr)
            delete m_pProduct;
    }
    //Lazy Initialization
    Product* GetProduct()
    {
        if (m_pProduct == nullptr)
            return m_pProduct = CreatProduct(m_id);
        else
            return m_pProduct;
    }
protected:
    virtual Product* CreatProduct(ProductID id) override
    {
        switch (id)
        {
        case ProductB:
            return new ConcreteProductB();
        case ProductC:
            return new ConcreteProductC();
        default:
            break;
        }
        return Factory::CreatProduct(id);//Call if all other fail
    }
private:
    Product* m_pProduct;
    ProductID m_id;
};
 
 
 
 
 

 

posted @ 2019-03-25 22:35  HenryLiuY  阅读(187)  评论(0)    收藏  举报