经典的设计模式

98 阅读1分钟

简单工厂模式

image.png

定义一个抽象类,即汽车

定义具体的汽车类型,继承自抽象类,即宝马和奔驰

定义一个工厂类,用于生产不同类型的汽车 ``#include

using namespace std;

enum CarType{BENZ, BMW};

class Car//车类

{

public:

    virtual void createdCar(void) = 0;

};

 

class BenzCar : public Car //奔驰车

{

public:

    BenzCar()

    {

        cout<<"Benz::Benz()"<<endl;

    }

    virtual void createdCar(void)

    {

        cout<<"BenzCar::createdCar()"<<endl;

    }

    ~BenzCar()

    {

 

    }

};

 

class BmwCar : public Car //宝马车

{

public:

    BmwCar()

    {

        cout<<"Bmw::Bmw()"<<endl;

    }

    virtual void createdCar(void)

    {

        cout<<"BmwCar::createdCar()"<<endl;

    }

};

 

 

class CarFactory //车厂

{

public:

    Car* createSpecificCar(CarType type)

    {

        switch(type)

        {

        case BENZ://生产奔驰车

            return (new BenzCar());

            break;

        case BMW://生辰宝马车

            return (new BmwCar());

            break;

        default:

            return NULL;

            break;

        }

    }

};

 

int main(int argc, char** argv)

{

    CarFactory carfac;

    Car* specificCarA = carfac.createSpecificCar(BENZ);//看到网上众多示例在new后没有delete,感觉不是特别严谨

    Car* specificCarB = carfac.createSpecificCar(BMW);

 

    delete specificCarA; delete specificCarB;

   

    return 0;

}``

image.png

为了加深学习,笔者写了一个实现计算器的代码

``#include

using namespace std;

class operation //运算的抽象类

{

public:

    double number_a=0;

    double number_b=0;

public:

    void Number_a(double a){number_a=a;}

    void Number_b(double b){number_b=b;}

    virtual double getResult(){

        return 10086;

    }

};

class operation_add:public operation // 加法

{

public:

    virtual double getResult(){

        double result=number_a+number_b;

        return result;

    }

};

class operation_sub:public operation // 减法

{

public:

    virtual double getResult(){

        double result=number_a-number_b;

        return result;

    }

};

class operation_mul:public operation // 乘法

{

public:

    virtual double getResult(){

        double result=number_a*number_b;

        return result;

    }

};

class operation_div:public operation // 除法

{

public:

    virtual double getResult(){

        if(abs(number_b)<1e-7){

            std::cout<<"divisor == 0"<<std::endl;

            return 0;

        }

        double result=number_a/number_b;

        return result;

    }

};

class operationFactory

{

public:

    operation* createOperate(char operate){

        switch (operate)

        {

            case '+':

                return new operation_add();

                break;

            case '-':

                return new operation_sub();

                break;

            case '*':

                return new operation_mul();

                break;

            case '/':

                return new operation_div();

                break;

            default:

                std::cout<<"Please input correct operation"<<std::endl;

                break;

        }

    }

};

 

int main(int argc, char** argv)

{

    operationFactory factory;

    operation* oper=factory.createOperate('*');

    oper->Number_a(3);

    oper->Number_b(2);

    double result=oper->getResult();

    cout<<result<<endl;

    return 0;

}``