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;
};
{
public:
Product(){};
virtual ~Product(){};
virtual void show() = 0;
};
class ConcreteProductA:public Product
{
public:
ConcreteProductA(){};
virtual ~ConcreteProductA(){};
virtual void show() override
{
printf("ConcreteProductA::show()\n");
}
};
{
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");
}
};
{
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");
}
};
{
public:
ConcreteProductC(){};
virtual ~ConcreteProductC (){};
virtual void show() override
{
printf("ConcreteProductC::show()\n");
}
};
typedef enum _ProductID
{
ProductA,
ProductB,
ProductC
}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;
}
};
{
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;
};
{
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;
};
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号