哈尔滨网站制作方案,扬中网站推广,麻章网站开发公司,江西网站建设价格低解释说明#xff1a;提供一个创建一系列相关或相互依赖对象的接口#xff0c;而无需指定他们具体的类。 简言之#xff0c;一个工厂可以提供创建多种相关产品的接口#xff0c;而无需像工厂方法一样#xff0c;为每一个产品都提供一个具体工厂 抽象工厂#xff08;Abstra… 解释说明提供一个创建一系列相关或相互依赖对象的接口而无需指定他们具体的类。 简言之一个工厂可以提供创建多种相关产品的接口而无需像工厂方法一样为每一个产品都提供一个具体工厂 抽象工厂AbstractFactory提供了创建抽象的接口它包含了多个创建产品的方法可以创建多个不同等级的产品 具体工厂ConcreteFactory主要是实现抽象工厂中的多个抽象方法完成具体产品的创建 抽象产品Product定义产品的规范描述了产品的主要特性和功能抽象工厂模式有多个抽象产品 具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建它同具体工厂之间是一对一的关系 优点 封装了产品的创建使得不需要知道具体是哪种产品只需要知道是哪个工厂即可。 可以支持不同类型的产品使得模式灵活性更强。 可以非常方便的使用一族中的不同类型的产品。 缺点 结构过于臃肿如果产品类型较多或产品族较多会非常难于管理。 每次如果添加一组产品那么所有的工厂类都必须添加一个方法这样违背了开放-封闭原则。所以一般适用于产品组合产品族变化不大的情况。 适用场景 在不必指定产品的具体的情况下创建多个产品族中的产品对象。 考虑这样一个场景如下图 Jungle想要进行户外运动它可以选择打篮球和踢足球。但这次Jungle不想弄脏原本穿的T恤所以Jungle还需要穿球衣打篮球就穿篮球衣踢足球就穿足球衣。篮球保管室可以提供篮球和篮球衣足球保管室可以提供足球和足球衣。Jungle只要根据心情去某个保管室就可以换上球衣、拿上球然后就可以愉快地玩耍了 对应的UML实例图如下图 #pragma once
#include string
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 iostream
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;
}