推荐文章:https://design-patterns.readthedocs.io/zh_CN/latest/index.html
抽象工厂模式只是比工厂方法模式多了更加丰富的产品。
class Product
{
public:
virtual void showProduct() = 0;
protected:
Product() {}
};
// 牛奶口味的糖果
class MilkSugar:public Product
{
public:
MilkSugar() :Product() {}
void showProduct() override
{
cout << "MilkSugar" << endl;
}
};
// 花生口味的糖果
class PeanutSugar :public Product
{
public:
PeanutSugar() :Product() {}
void showProduct() override
{
cout << "PeanutSugar" << endl;
}
};
// 牛奶口味的曲奇饼
class MilkCookie :public Product
{
public:
MilkCookie() :Product() {}
void showProduct() override
{
cout << "MilkCookie" << endl;
}
};
// 花生口味的曲奇饼
class PeanutCookie :public Product
{
public:
PeanutCookie() :Product() {}
void showProduct() override
{
cout << "PeanutCookie" << endl;
}
};
// 既可以创建糖果又可以创建曲奇饼
class Factory
{
public:
virtual Product* createSugar() = 0;
virtual Product* createCookie() = 0;
protected:
Factory() {}
};
// 生产牛奶口味的糖果和曲奇饼
class MilkTasteFactory :public Factory
{
public:
MilkTasteFactory() :Factory(), m_sugar(NULL),m_cookie(NULL) {}
~MilkTasteFactory() { delete m_sugar; m_sugar = NULL; delete m_cookie; m_cookie = NULL; }
Product* createSugar() override
{
m_sugar = new MilkSugar();
return m_sugar;
}
Product* createCookie() override
{
m_cookie = new MilkCookie();
return m_cookie;
}
private:
Product* m_sugar;
Product* m_cookie;
};
// 生产花生口味的糖果和曲奇饼
class PeanutTasteFactory :public Factory
{
public:
PeanutTasteFactory() :Factory(), m_sugar(NULL), m_cookie(NULL) {}
~PeanutTasteFactory() { delete m_sugar; m_sugar = NULL; delete m_cookie; m_cookie = NULL; }
Product* createSugar() override
{
m_sugar = new MilkSugar();
return m_sugar;
}
Product* createCookie() override
{
m_cookie = new MilkCookie();
return m_cookie;
}
private:
Product* m_sugar;
Product* m_cookie;
};
int main()
{
// 工厂对象
Factory* milkFactory = new MilkTasteFactory();
Product* cookie = milkFactory->createCookie();
Product* sugar = milkFactory->createSugar();
cookie->showProduct(); // MilkCookie
sugar->showProduct(); // MilkSugar
Factory* peanutFactory = new PeanutTasteFactory();
cookie = peanutFactory->createCookie();
sugar = peanutFactory->createSugar();
cookie->showProduct(); // PeanutCookie
sugar->showProduct(); // PeanutSugar
}