设计模式之 抽象工厂模式的扩展(C++实现)

来源:互联网 发布:关于编程的电影 编辑:程序博客网 时间:2024/06/06 05:52

上一篇主要介绍了抽象工厂模式。


考虑下面一种应用场景:我们需要增加一个产品族,如何实现。


当然可以考虑修改抽象工厂 增加相应的方法。

但这违反了面向对象编程的原则——开放闭合原则。


因此我们需要尽量去扩展 而不是修改。【对扩展开发 对修改闭合】


下面给出汽车厂中增加卡车产品族的例子

代码如下:

#include <iostream>#include <string>#include <memory>using namespace std;class CCarBase{public:virtual void printName(){cout << "汽车厂商:" << m_name << endl;}virtual ~CCarBase(){}protected:CCarBase(){}CCarBase(const string& name) :m_name(name){}string m_name;};// 第一种产品class CBusinessCarBase : public CCarBase{protected:CBusinessCarBase(){}CBusinessCarBase(const string& name) :CCarBase(name){}};// 第二种产品class CSportCarBase :public CCarBase{protected:CSportCarBase(){}CSportCarBase(const string& name) :CCarBase(name){}};// 扩展:第三种产品class CTruckCarBase :public CCarBase{protected:CTruckCarBase(){}CTruckCarBase(const string& name) :CCarBase(name){}};// 第一个工厂生产的第一种产品class CBMWBusinessCar : public CBusinessCarBase{public:CBMWBusinessCar() :CBusinessCarBase("BMW"){}void printName(){cout << "BMW business car" << endl;CBusinessCarBase::printName();}};// 第一个工厂生产的第二种产品class CBMWSportCar : public CSportCarBase{public:CBMWSportCar() :CSportCarBase("BMW"){}void printName(){cout << "BMW Sport car" << endl;CSportCarBase::printName();}};// 第二个工厂生产的第一种产品class CBenzBusinessCar : public CBusinessCarBase{public:CBenzBusinessCar() :CBusinessCarBase("Benz"){}void printName(){cout << "Benz business car" << endl;CBusinessCarBase::printName();}};// 第二个工厂生产的第二种产品class CBenzSportCar : public CSportCarBase{public:CBenzSportCar() :CSportCarBase("Benz"){}void printName(){cout << "Benz Sport car" << endl;CSportCarBase::printName();}};// 抽象工厂(生产多个工厂)class IAbstractFactory{public:virtual CBusinessCarBase* createBusinessCar() = 0;virtual CSportCarBase* createSportCar() = 0;};// 第一个工厂class BMWFactory :public IAbstractFactory{public:CBusinessCarBase* createBusinessCar(){return new CBMWBusinessCar();}CSportCarBase* createSportCar(){return new CBMWSportCar();}};// 第二个工厂class BenzFactory :public IAbstractFactory{public:CBusinessCarBase* createBusinessCar(){return new CBenzBusinessCar();}CSportCarBase* createSportCar(){return new CBenzSportCar();}};// 扩展:第三个工厂(Truck)class IExtendAbstractFactory :public IAbstractFactory{public:virtual CTruckCarBase* createTruckCar() = 0;};class CBMWTruckCar : public CTruckCarBase{public:CBMWTruckCar() :CTruckCarBase("BMW"){}void printName(){cout << "BMW Truck car" << endl;CTruckCarBase::printName();}};// 扩展class CBenzTruckCar : public CTruckCarBase{public:CBenzTruckCar() :CTruckCarBase("Benz"){}void printName(){cout << "Benz Truck car" << endl;CTruckCarBase::printName();}};// 扩展工厂类class BenzExtendFactory :public IExtendAbstractFactory{public:CBusinessCarBase* createBusinessCar(){return factory.createBusinessCar();}CSportCarBase* createSportCar(){return factory.createSportCar();}CTruckCarBase* createTruckCar(){return new CBenzTruckCar();}protected:// 采用接口继承BenzFactory factory;};class BMWExtendFactory :public IExtendAbstractFactory{public:CBusinessCarBase* createBusinessCar(){return factory.createBusinessCar();}CSportCarBase* createSportCar(){return factory.createSportCar();}CTruckCarBase* createTruckCar(){return new CBMWTruckCar();}protected:// 采用接口继承BMWFactory factory;};void testAbstractFactoryExtension(){CBusinessCarBase* pBCar = NULL;CSportCarBase* pSCar = NULL;CTruckCarBase* pTCar = NULL;BMWExtendFactory bmwFactory;BenzExtendFactory benzFactory;pBCar = bmwFactory.createBusinessCar();pBCar->printName();delete pBCar;pSCar = bmwFactory.createSportCar();pSCar->printName();delete pSCar;pTCar = bmwFactory.createTruckCar();pTCar->printName();delete pTCar;pBCar = benzFactory.createBusinessCar();pBCar->printName();delete pBCar;pSCar = benzFactory.createSportCar();pSCar->printName();delete pSCar;pTCar = benzFactory.createTruckCar();pTCar->printName();delete pTCar;}int main(void){testAbstractFactoryExtension();return 0;}


0 0
原创粉丝点击