经典的设计模式

本文介绍了设计模式中的简单工厂、工厂方法和抽象工厂模式,通过汽车和计算器的实例展示了如何使用这些模式。简单工厂模式在扩展时违反了开放封闭原则,因此引入了工厂方法模式,允许在不修改原有代码的情况下扩展产品。进一步地,为了解决更复杂的场景,抽象工厂模式应运而生,能够创建一系列相关的对象。文章深入浅出地阐述了三种模式的概念和应用场景。
摘要由CSDN通过智能技术生成

简单工厂模式

在这里插入图片描述

定义一个抽象类,即汽车
定义具体的汽车类型,继承自抽象类,即宝马和奔驰
定义一个工厂类,用于生产不同类型的汽车

#include <iostream>
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;
}

在这里插入图片描述
为此写了一个实现计算器的代码

#include <iostream>
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;
}

简单工厂模式在每次增加新的车型时,需要修改工厂类,这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。

工厂方法模式

在这里插入图片描述

建立一个汽车抽象类和工厂抽象类
具体的汽车类型继承自汽车抽象类,如宝马、奔驰
具体生产某种汽车的工厂继承自工厂抽象类,如生产宝马的工厂、生产奔驰的共产

#include <iostream>
using namespace std;
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 Factory//车厂
{
public:
    virtual Car* createSpecificCar(void) = 0;
};

class BenzFactory : public Factory//奔驰车厂
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BenzCar());
    }
};

class BmwFactory : public Factory//宝马车厂
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BmwCar());
    }
};

int main(int argc, char** argv)
{
    Factory* factory = new BenzFactory();
    Car* specificCarA = factory->createSpecificCar();
    factory = new BmwFactory();
    Car* specificCarB = factory->createSpecificCar();
    
    delete factory; delete specificCarA; delete specificCarB;
    
    return 0;
}

在这里插入图片描述
为此写了一个实现计算器的代码

#include <iostream>
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 0;
    }
};
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:
    virtual operation* createOperate(){}
};
class addFactory:public operationFactory
{
public:
    virtual operation* createOperate(){return new operation_add();}
};
class subFactory:public operationFactory
{
public:
    virtual operation* createOperate(){return new operation_sub();}
};
class mulFactory:public operationFactory
{
public:
    virtual operation* createOperate(){return new operation_mul();}
};
class divFactory:public operationFactory
{
public:
    virtual operation* createOperate(){return new operation_div();}
};

int main(int argc, char** argv)
{
    operationFactory* factory = new addFactory();
    operation* oper=factory->createOperate();
    oper->Number_a(3);
    oper->Number_b(2);
    double result=oper->getResult();
    cout<<result<<endl;
return 0;
}

抽象工厂模式

在上面的工厂方法模式基础上,有需要生产高配版的奔驰和宝马,那工厂方法模式就有点鞭长莫及了,这就又有抽象工厂模式,UML类图如下:
在这里插入图片描述

#include <iostream>
using namespace std;
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 HighCar //高配版车型
{
public:
    virtual void createdCar(void) = 0;
};

class HighBenzCar : public HighCar //高配奔驰车
{
public:
    HighBenzCar()
    {
        cout<<"HighBenzCarBenz::Benz()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"HighBenzCar::createdCar()"<<endl;
    }
};

class HighBmwCar : public HighCar //高配宝马车
{
public:
    HighBmwCar()
    {
        cout<<"HighBmwCar::Bmw()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"HighBmwCar::createdCar()"<<endl;
    }
};

class Factory//车厂
{
public:
    virtual Car* createSpecificCar(void) = 0;
    virtual HighCar* createdSpecificHighCar(void) = 0;
};

class BenzFactory : public Factory//奔驰车厂
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BenzCar());
    }

    virtual HighCar* createdSpecificHighCar(void)
    {
        return (new HighBenzCar());
    }
};

class BmwFactory : public Factory//宝马车厂
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BmwCar());
    }
    virtual HighCar* createdSpecificHighCar(void)
    {
        return (new HighBmwCar());
    }
};

int main(int argc, char** argv)
{
    Factory* factory = new BenzFactory();
    Car* specificCar = factory->createSpecificCar();
    HighCar* spcificHighCar = factory->createdSpecificHighCar();
    
    delete factory; delete specificCar; delete spcificHighCar;
    
    return 0;
}

在这里插入图片描述
觉得写的不错的小伙伴,可以点一个赞哦,多谢!
其他设计模式将在陆续更新中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值