- #pragma once
- #include
- using namespace std;
- // 汽车接口
- class ICar
- {
- public:
- virtual string Name() = 0; // 汽车名称
- };
- /********** 汽车 **********/
- // 奔驰
- class BenzCar : public ICar
- {
- public:
- string Name() {
- return "Benz Car";
- }
- };
- // 宝马
- class BmwCar : public ICar
- {
- public:
- string Name() {
- return "Bmw Car";
- }
- };
- // 奥迪
- class AudiCar : public ICar
- {
- public:
- std::string Name() {
- return "Audi Car";
- }
- };
- // 自行车接口
- class IBike
- {
- public:
- virtual string Name() = 0; // 自行车名称
- };
- /********** 自行车 **********/
- // 奔驰
- class BenzBike : public IBike
- {
- public:
- string Name() {
- return "Benz Bike";
- }
- };
- // 宝马
- class BmwBike : public IBike
- {
- public:
- string Name() {
- return "Bmw Bike";
- }
- };
- // 奥迪
- class AudiBike : public IBike
- {
- public:
- string Name() {
- return "Audi Bike";
- }
- };
-
- #include "product.h"
- // 抽象工厂
- class AFactory
- {
- public:
- enum FACTORY_TYPE {
- BENZ_FACTORY, // 奔驰工厂
- BMW_FACTORY, // 宝马工厂
- AUDI_FACTORY // 奥迪工厂
- };
- virtual ICar* CreateCar() = 0; // 生产汽车
- virtual IBike* CreateBike() = 0; // 生产自行车
- static AFactory* CreateFactory(FACTORY_TYPE factory); // 创建工厂
- };
-
- #include "factory.h"
- #include "product.h"
- // 奔驰工厂
- class BenzFactory : public AFactory
- {
- public:
- ICar* CreateCar() {
- return new BenzCar();
- }
- IBike* CreateBike() {
- return new BenzBike();
- }
- };
- // 宝马工厂
- class BmwFactory : public AFactory
- {
- public:
- ICar* CreateCar() {
- return new BmwCar();
- }
- IBike* CreateBike() {
- return new BmwBike();
- }
- };
- // 奥迪工厂
- class AudiFactory : public AFactory
- {
- public:
- ICar* CreateCar() {
- return new AudiCar();
- }
- IBike* CreateBike() {
- return new AudiBike();
- }
- };
- // 创建工厂
- AFactory* AFactory::CreateFactory(FACTORY_TYPE factory)
- {
- AFactory* pFactory = NULL;
- switch (factory) {
- case FACTORY_TYPE::BENZ_FACTORY: // 奔驰工厂
- pFactory = new BenzFactory();
- break;
- case FACTORY_TYPE::BMW_FACTORY: // 宝马工厂
- pFactory = new BmwFactory();
- break;
- case FACTORY_TYPE::AUDI_FACTORY: // 奥迪工厂
- pFactory = new AudiFactory();
- break;
- default:
- break;
- }
- return pFactory;
- }
-
- #include "factory.h"
- #include "product.h"
- #include
- using namespace std;
- #ifndef SAFE_DELETE
- #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
- #endif
- int main()
- {
- // 奔驰
- AFactory* pFactory = AFactory::CreateFactory(AFactory::FACTORY_TYPE::BENZ_FACTORY);
- ICar* pCar = pFactory->CreateCar();
- IBike* pBike = pFactory->CreateBike();
- cout << "Benz factory - Car: " << pCar->Name() << endl;
- cout << "Benz factory - Bike: " << pBike->Name() << endl;
- SAFE_DELETE(pCar);
- SAFE_DELETE(pBike);
- SAFE_DELETE(pFactory);
- // 宝马
- pFactory = AFactory::CreateFactory(AFactory::FACTORY_TYPE::BMW_FACTORY);
- pCar = pFactory->CreateCar();
- pBike = pFactory->CreateBike();
- cout << "Bmw factory - Car: " << pCar->Name() << endl;
- cout << "Bmw factory - Bike: " << pBike->Name() << endl;
- SAFE_DELETE(pCar);
- SAFE_DELETE(pBike);
- SAFE_DELETE(pFactory);
- // 奥迪
- pFactory = AFactory::CreateFactory(AFactory::FACTORY_TYPE::AUDI_FACTORY);
- pCar = pFactory->CreateCar();
- pBike = pFactory->CreateBike();
- cout << "Audi factory - Car: " << pCar->Name() << endl;
- cout << "Audi factory - Bike: " << pBike->Name() << endl;
- SAFE_DELETE(pCar);
- SAFE_DELETE(pBike);
- SAFE_DELETE(pFactory);
- getchar();
- return 0;
- }