C++与设计模式(1)--工厂模式

来源:互联网 发布:云计算综述 编辑:程序博客网 时间:2024/06/05 10:12

前言

在说设计模式之前先声明很重要的一点
不要滥用设计模式

工厂模式

工厂模式主要特点是需要在工厂类中做判断,从而创造相应的产品。作为创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式

举个例子,一家汽车公司生产两种型号的汽车:A型车和B型车,现在公司只有一个工厂来生产汽车,公司直接告诉工厂要生产哪种汽车:

enum TYPE{CARA,CARB};//汽车类class Car{public:    virtual void show() = 0;};class CarA : public Car{public:    void show()    {        cout << "This is A car";    }};class CarB : public Car{public:    void show()    {        cout << "This is B car";    }};//工厂class Factory{public:    Car* createCar(TYPE type)    {        switch(type)        {        case CARA:            return new CarA;        case CARB:            return new CarB;        default:            return nullptr;        }    }};

这样我们可以通过工厂提供的接口来生产不同种类的汽车,但如果我们要增加新的汽车就要修改工厂类,这非常的不方便,在这种需要扩展而又不能修改的要求,工厂方法就出现了。

工厂方法

工厂方法使用继承工厂类的方法来实现可扩展性,简单来说就是把生产A车和B车的任务分在两个工厂里。

//汽车类class Car{public:    virtual void show() = 0;};class CarA : public Car{public:    void show()    {        cout << "This is A car";    }};class CarB : public Car{public:    void show()    {        cout << "This is B car";    }};//工厂class Factory{public:    virtual Car* createCar(TYPE type) = 0;};class FactoryA : Factory{public:    Car* createCar()    {        return new CarA;    }};class FactoryB : Factory{public:    Car* createCar()    {        return new CarB;    }};

这样在添加新的车型时就可以通过继承新的工厂来扩展生产。

抽象工厂模式

先简述一下抽象工厂和一般工厂的不同之处:一般工厂生产的是单一类型的产品,比如不管A型车还是B型车之前都是使用a引擎的汽车,现在公司引入了β引擎,需要增加生产b引擎的A、B汽车的工厂,现在就要使用抽象工厂:生产复杂类型的工厂。

//汽车类class aCar{public:    virtual void show() = 0;};class aCarA : public aCar{public:    void show()    {        cout << "This is A car";    }};class aCarB : public aCar{public:    void show()    {        cout << "This is B car";    }};class bCar{public:    virtual void show() = 0;};class bCarA : public bCar{public:    void show()    {        cout << "This is A car";    }};class bCarB : public bCar{public:    void show()    {        cout << "This is B car";    }};//工厂class Factory{public:    virtual aCar* createACar(TYPE type) = 0;    virtual bCar* createBCar(TYPE type) = 0;};class FactoryA : Factory{public:    aCar* createACar()    {        return new aCarA;    }    bCar* createBCar()    {        return new bCarA;    }};class FactoryB : Factory{public:    aCar* createACar()    {        return new aCarB;    }    bCar* createBCar()    {        return new bCarB;    }};
0 0
原创粉丝点击