设计模式之c++实现(三)

来源:互联网 发布:淘宝网店的名字怎么起 编辑:程序博客网 时间:2024/05/19 09:10

工厂方法模式

工厂方法模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不负责产品的创建,成为一个抽象角色,仅负责具体工厂子类必须实现的接口。
实现了可扩展。

factory.h

#ifndef __FACTORY_H_#define __FACTORY_H_#include "simplefactory.h"class FactoryBase{public:    //声明工厂子类必须实现的接口,不负责产品的创建    virtual CarBase* createCar() = 0; };//将实际创建工作推迟到子类class GMFactory : public FactoryBase{public:    CarBase* createCar()    {            return new GMCar();     }   };class FordFactory : public FactoryBase{public:    CarBase* createCar()    {            return new FordCar();     }   };class ToyotaFactory : public FactoryBase{public:    CarBase* createCar()    {            return new ToyotaCar();     }   };#endif

测试代码

#include "factory.h"int main(){    GMFactory f1;    FordFactory f2;    ToyotaFactory f3;    FactoryBase* pfactory = &f1;    CarBase* pcar = pfactory->createCar();    pcar->printName();    delete pcar;    pfactory = &f2;    pcar = pfactory->createCar();    pcar->printName();    delete pcar;    pfactory = &f3;    pcar = pfactory->createCar();    pcar->printName();    delete pcar;    return 0;}

使用工厂方法虽然进行了解耦,是程序更加灵活,但是太多工厂类带来了类膨胀的后果。
采用模板工厂模式

factory.h 中添加模板

class CarFactoryBase{public:    template<class Tcar>    static CarBase* createCar()    {        return new Tcar();    }};

测试代码

#include "factory.h"int main(){    CarBase* pcar = CarFactoryBase::createCar<GMCar>();    pcar->printName();    delete pcar;    pcar = CarFactoryBase::createCar<ToyotaCar>();    pcar->printName();    delete pcar;    pcar = CarFactoryBase::createCar<FordCar>();    pcar->printName();    delete pcar;    return 0;}

然而,工厂方法可以用于更加复杂的对象创建过程。耦合性非常低,易于扩展。工厂方法符合了面向对象的开放-封闭原则(OCP)。
软件实体应该是可扩展,而不可修改的。也就是说对扩展是开放的,而对修改是封闭的。

0 0
原创粉丝点击