UML类图
现在要讲的抽象工厂模式,就是工厂方法模式的扩展和延伸,但是抽象工厂模式,更有一般性和代表性;它具有工厂方法具有的优点,也增加了解决实际问题的能力。
如图所示,抽象工厂模式,就好比是两个工厂方法模式的叠加。抽象工厂创建的是一系列相关的对象,其中创建的实现其实就是采用的工厂方法模式。在工厂Factory中的每一个方法,就好比是一条生产线,而生产线实际需要生产什么样的产品,这是由Factory1和Factory2去决定的,这样便延迟了具体子类的实例化;同时集中化了生产线的管理,节省了资源的浪费。
适用场合
工厂方法模式适用于产品种类结构单一的场合,为一类产品提供创建的接口;而抽象工厂方法适用于产品种类结构多的场合,主要用于创建一组(有多个种类)相关的产品,为它们提供创建的接口;就是当具有多个抽象角色时,抽象工厂便可以派上用场。
代码实现
#include <iostream>
using namespace std;
// Product A
class ProductA
{
public:
virtual void Show() = 0;
};
class ProductA1 : public ProductA
{
public:
void Show()
{
cout<<"I'm ProductA1"<<endl;
}
};
class ProductA2 : public ProductA
{
public:
void Show()
{
cout<<"I'm ProductA2"<<endl;
}
};
// Product B
class ProductB
{
public:
virtual void Show() = 0;
};
class ProductB1 : public ProductB
{
public:
void Show()
{
cout<<"I'm ProductB1"<<endl;
}
};
class ProductB2 : public ProductB
{
public:
void Show()
{
cout<<"I'm ProductB2"<<endl;
}
};
// Factory
class Factory
{
public:
virtual ProductA *CreateProductA() = 0;
virtual ProductB *CreateProductB() = 0;
};
class Factory1 : public Factory
{
public:
ProductA *CreateProductA()
{
return new ProductA1();
}
ProductB *CreateProductB()
{
return new ProductB1();
}
};
class Factory2 : public Factory
{
ProductA *CreateProductA()
{
return new ProductA2();
}
ProductB *CreateProductB()
{
return new ProductB2();
}
};
int main(int argc, char *argv[])
{
Factory *factoryObj1 = new Factory1();
ProductA *productObjA1 = factoryObj1->CreateProductA();
ProductB *productObjB1 = factoryObj1->CreateProductB();
productObjA1->Show();
productObjB1->Show();
Factory *factoryObj2 = new Factory2();
ProductA *productObjA2 = factoryObj2->CreateProductA();
ProductB *productObjB2 = factoryObj2->CreateProductB();
productObjA2->Show();
productObjB2->Show();
if (factoryObj1 != NULL)
{
delete factoryObj1;
factoryObj1 = NULL;
}
if (productObjA1 != NULL)
{
delete productObjA1;
productObjA1= NULL;
}
if (productObjB1 != NULL)
{
delete productObjB1;
productObjB1 = NULL;
}
if (factoryObj2 != NULL)
{
delete factoryObj2;
factoryObj2 = NULL;
}
if (productObjA2 != NULL)
{
delete productObjA2;
productObjA2 = NULL;
}
if (productObjB2 != NULL)
{
delete productObjB2;
productObjB2 = NULL;
}
}
生产手机:
#include <iostream>
using namespace std;
// Product A
class ProductHigh
{
public:
virtual void Show() = 0;
};
class ProductXiaomi : public ProductHigh
{
public:
void Show()
{
cout<<"I'm ProductXiaomi_10"<<endl;
}
};
class ProductHuaweiMate : public ProductHigh
{
public:
void Show()
{
cout<<"I'm ProductHuaweiMate"<<endl;
}
};
// Product B
class ProductMiddle
{
public:
virtual void Show() = 0;
};
class ProductRedmi : public ProductMiddle
{
public:
void Show()
{
cout<<"I'm ProductRedmi"<<endl;
}
};
class ProductHonour : public ProductMiddle
{
public:
void Show()
{
cout<<"I'm ProductHonour"<<endl;
}
};
// Factory
class Factory
{
public:
virtual ProductHigh *ProductHighPhone() = 0;
virtual ProductMiddle *ProductMiddlePhone() = 0;
};
class FactoryFoxconn : public Factory
{
public:
ProductHigh *ProductHighPhone()
{
return new ProductXiaomi();
}
ProductMiddle *ProductMiddlePhone()
{
return new ProductRedmi();
}
};
class FactoryBYD : public Factory
{
ProductHigh *ProductHighPhone()
{
return new ProductHuaweiMate();
}
ProductMiddle *ProductMiddlePhone()
{
return new ProductHonour();
}
};
int main(int argc, char *argv[])
{
cout << "********FactoryFoxcon*************" << endl;
Factory *factoryObj1 = new FactoryFoxconn();
ProductHigh *productObjA1 = factoryObj1->ProductHighPhone();
ProductMiddle *productObjB1 = factoryObj1->ProductMiddlePhone();
productObjA1->Show();
productObjB1->Show();
cout << "*************FactoryBYD*************" << endl;
Factory *factoryObj2 = new FactoryBYD();
ProductHigh *productObjA2 = factoryObj2->ProductHighPhone();
ProductMiddle *productObjB2 = factoryObj2->ProductMiddlePhone();
productObjA2->Show();
productObjB2->Show();
if (factoryObj1 != NULL)
{
delete factoryObj1;
factoryObj1 = NULL;
}
if (productObjA1 != NULL)
{
delete productObjA1;
productObjA1= NULL;
}
if (productObjB1 != NULL)
{
delete productObjB1;
productObjB1 = NULL;
}
if (factoryObj2 != NULL)
{
delete factoryObj2;
factoryObj2 = NULL;
}
if (productObjA2 != NULL)
{
delete productObjA2;
productObjA2 = NULL;
}
if (productObjB2 != NULL)
{
delete productObjB2;
productObjB2 = NULL;
}
}
以高中端划分:
#include <iostream>
using namespace std;
// Product A
class ProductHigh
{
public:
virtual void Show() = 0;
};
class ProductXiaomi : public ProductHigh
{
public:
void Show()
{
cout<<"I'm ProductXiaomi_10"<<endl;
}
};
class ProductHuaweiMate : public ProductHigh
{
public:
void Show()
{
cout<<"I'm ProductHuaweiMate"<<endl;
}
};
// Product B
class ProductMiddle
{
public:
virtual void Show() = 0;
};
class ProductRedmi : public ProductMiddle
{
public:
void Show()
{
cout<<"I'm ProductRedmi"<<endl;
}
};
class ProductHonour : public ProductMiddle
{
public:
void Show()
{
cout<<"I'm ProductHonour"<<endl;
}
};
// Factory
class Factory
{
public:
virtual ProductHigh *ProductHighPhone() = 0;
virtual ProductMiddle *ProductMiddlePhone() = 0;
};
class FactoryFoxconn : public Factory
{
public:
ProductHigh *ProductHighPhone()
{
return new ProductXiaomi();
}
ProductMiddle *ProductMiddlePhone()
{
return new ProductRedmi();
}
};
class FactoryBYD : public Factory
{
ProductHigh *ProductHighPhone()
{
return new ProductHuaweiMate();
}
ProductMiddle *ProductMiddlePhone()
{
return new ProductHonour();
}
};
int main(int argc, char *argv[])
{
cout << "********FactoryFoxcon*************" << endl;
Factory *factoryObj1 = new FactoryFoxconn();
ProductHigh *productObjA1 = factoryObj1->ProductHighPhone();
ProductMiddle *productObjB1 = factoryObj1->ProductMiddlePhone();
productObjA1->Show();
productObjB1->Show();
cout << "*************FactoryBYD*************" << endl;
Factory *factoryObj2 = new FactoryBYD();
ProductHigh *productObjA2 = factoryObj2->ProductHighPhone();
ProductMiddle *productObjB2 = factoryObj2->ProductMiddlePhone();
productObjA2->Show();
productObjB2->Show();
if (factoryObj1 != NULL)
{
delete factoryObj1;
factoryObj1 = NULL;
}
if (productObjA1 != NULL)
{
delete productObjA1;
productObjA1= NULL;
}
if (productObjB1 != NULL)
{
delete productObjB1;
productObjB1 = NULL;
}
if (factoryObj2 != NULL)
{
delete factoryObj2;
factoryObj2 = NULL;
}
if (productObjA2 != NULL)
{
delete productObjA2;
productObjA2 = NULL;
}
if (productObjB2 != NULL)
{
delete productObjB2;
productObjB2 = NULL;
}
}