抽象工厂模式概念
- 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
抽象工厂模式实例
以组装电脑为例,一般来说,电脑组装都不可能是一家公司的零件,简单的来说,显卡就有NVIDIA和AMD两个牌子的厂商,电脑系统由windows和mac两种,所以可以用抽象工厂的思维来用计算机表达出来。
头文件
#include "stdafx.h"
//显卡基类
class GraphicCard
{
public:
virtual void cardType()=0; //显卡品牌
};
//英伟达显卡
class NvidiaGraphicCard:public GraphicCard
{
public:
void cardType(); //显卡品牌
};
//AMD显卡
class AmdGraphicCard:public GraphicCard
{
public:
void cardType(); //显卡品牌
};
//计算机系统基类
class ComputerSystem
{
public:
virtual void systemType() =0;
};
//MAC计算机系统类
class MACComputerSystem:public ComputerSystem
{
public:
void systemType();
};
//WIN计算机系统类
class WINComputerSystem:public ComputerSystem
{
public:
void systemType();
};
//工厂基类
class Factory
{
public:
virtual ComputerSystem * createComputerSystem() = 0; //创建计算机系统的类别
virtual GraphicCard* createGraphicSystem() = 0; //创建显卡的类别
};
//宏碁工厂
class AcerFactory:public Factory
{
public:
ComputerSystem * createComputerSystem(); //创建计算机系统的类别
GraphicCard* createGraphicSystem(); //创建显卡的类别
};
//华硕工厂
class AsusFactory:public Factory
{
public:
ComputerSystem * createComputerSystem(); //创建计算机系统的类别
GraphicCard* createGraphicSystem(); //创建显卡的类别
};
实现文件:
// AbstractFactory.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "AbstractFactory.h"
using namespace std;
//实现
//实现显卡
void AmdGraphicCard::cardType()
{
cout << "生产AMD显卡" << endl;
}
void NvidiaGraphicCard::cardType()
{
cout << "生产英伟达显卡" << endl;
}
void WINComputerSystem::systemType()
{
cout << "系统为WINDOWS系统" << endl;
}
void MACComputerSystem::systemType()
{
cout << "系统为MAC系统" << endl;
}
ComputerSystem* AcerFactory::createComputerSystem()
{
cout << "宏碁电脑工厂:"<<endl;
return new MACComputerSystem(); //生产Mac系统
}
ComputerSystem* AsusFactory::createComputerSystem()
{
cout << "华硕电脑工厂:"<<endl;
return new WINComputerSystem(); //生产WIN系统
}
GraphicCard* AcerFactory::createGraphicSystem()
{
cout << "宏碁电脑工厂:"<<endl;
return new AmdGraphicCard(); //生产amd显卡
}
GraphicCard* AsusFactory::createGraphicSystem()
{
cout << "华硕电脑工厂:"<<endl;
return new NvidiaGraphicCard(); //生产英伟达显卡
}
int _tmain(int argc, _TCHAR* argv[])
{
//调用
Factory * cur_factory = new AcerFactory();
ComputerSystem * cur_system= cur_factory->createComputerSystem();
cur_system->systemType();
GraphicCard * cur_gra = cur_factory->createGraphicSystem();
cur_gra->cardType();
return 0;
}
运行结果:
抽象工厂模式用处
抽象工厂可以用于描述现在全球化市场,就是一辆车的配件可以来自各个地方,而且每个地方生产的东西可能还都不相似。
比较麻烦的一点的,如果需要添加产品的话,需要增加很多类。
抽象工厂方法模式和工厂方法模式的区别
- 工厂方法模式只有一个抽象产品类,而抽象工厂有多个