本文不讨论抽象工厂模式的具体定义
抽象工厂比工厂方法复杂一点点,思路还是差不多的,就是自己不生产产品,产品都交由工厂生产。
工厂方法就是只生产一个类的产品,即工厂也是一类的工厂,到了抽象工厂就是把工厂再网上抽象一层,即工厂也有很多种。工厂生产的产品是固定的,每一个工厂生产出来的产品又有些许不同。
还是要注意内存的释放,这里是交由Client函数进行释放了。
图片自此
代码:
#include<iostream>
using namespace std;
//椅子的抽象基类
class AbstractChair
{
public:
virtual ~AbstractChair(){}
virtual string useChair()const=0;
};
//椅子的具体类
class Chair:public AbstractChair
{
public:
string useChair()const override
{
return "椅子";
}
};
//抽象的沙发基类
class AbstractSofa
{
public:
virtual ~AbstractSofa(){}
virtual string useSofa()const=0;
};
//沙发的具体类
class Sofa:public AbstractSofa
{
public:
string useSofa()const override
{
return "沙发";
}
};
//抽象工厂
class AbstractFactory
{
public:
virtual AbstractChair* createProductChair()const =0;
virtual AbstractSofa* createProductSofa()const =0;
virtual ~AbstractFactory(){}
};
//生产艺术的工厂
class ArtFactory:public AbstractFactory
{
public:
AbstractChair* createProductChair()const override
{
AbstractChair* ch=new Chair;
cout<<ch->useChair()+"艺术风格"<<endl;
return ch;
}
AbstractSofa* createProductSofa()const override
{
AbstractSofa* so=new Sofa;
cout<<so->useSofa()+"艺术风格"<<endl;
return so;
}
};
//生产现代风格的工厂
class ModernFactory:public AbstractFactory
{
public:
AbstractChair* createProductChair()const override
{
AbstractChair* ch=new Chair;
cout<<ch->useChair()+"现代风格"<<endl;
return ch;
}
AbstractSofa* createProductSofa()const override
{
AbstractSofa* so=new Sofa;
cout<<so->useSofa()+"现代风格"<<endl;
return so;
}
};
void Client(const AbstractFactory& factory)
{
const AbstractChair* chair=factory.createProductChair();
const AbstractSofa* sofa=factory.createProductSofa();
delete chair;
delete sofa;
}
int main()
{
AbstractFactory* f1=new ArtFactory;
Client(*f1);//椅子艺术风格 沙发艺术风格
delete f1;
return 0;
}