• C++面对对象设计模式


    singletons(单例模式)

    单例模式的出现意义在于,我们一个class只想要其有一个对象,我们直接看示例代码

    #include 
    
    using namespace std;
    
    class singleton{
    
    private:
        //make default constructor unable to access from outside of class
        singleton(){};
        static singleton* instance;
    
    public:
        singleton(singleton const &) = delete;
        static singleton* getinstance();
    
    };
    
    singleton* singleton::instance = nullptr;
    
    singleton*
    singleton::getinstance(){
        if(!instance){
            instance = new singleton;
        }
        
        return instance;
    }
    
    int 
    main()
    {
        singleton* simple_singleton_1 = singleton::getinstance();
        singleton* simple_singleton_2 = singleton::getinstance();
        
        cout << "simple_singleton_1 is " << simple_singleton_1 << " simple_singleton_2 is " << simple_singleton_2;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    上述的代码我们没有显示的示例化的操作(就算有也会被编译器报错,因为我们明确的禁止外部进行默认的构造),我们还要明确一点我们的class的prototype存于code区域(text),而不是stack,所以我们可以执行getinstance()方法,但是我们执行的时候要明确指明范围也就是singleton::,并且我们的getinstance()创造的对象(obj指针变量,obj本来的数据还在stack中)存于data区域中,我们的class如果再创建一个对象还是要走getinstance()方法,我们的getinstance()方法的第一行是一个条件判断,发现singleton::instance不为空,那么就不会通过条件判断直接返回data区域中已经存在的obj指针变量(也就是第一个创建的obj地址)

    为什么创建obj的方法也要static?因为我们想等实例化后obj对应的static方法放入到data区域中,假如我们不加static那么就会在stack中

    最后看运行结果

    simple_singleton_1 is 0x55e4334e8eb0 simple_singleton_2 is 0x55e4334e8eb0
    
    • 1

    factory(工厂模式)

    工厂模式顾名思义就是将我们的类像工厂一样生产东西,比如我们一个工厂有三个流水线分别生产三个不同的产品,所以一个工厂类可以更具我们的需求生产不同的对象(在类实例化成对象的时候更具需求实例成不同的对象),工厂模式又分为多个类别

    简单工厂模式

    直接看代码

    #include 
    
    using namespace std;
    
    enum  CARTYPE {byd_type, tesla_type};
    
    class car{
    public:
        virtual void echo() = 0; //什么类型的car
        virtual ~car(); //为了安全,确保car的派生类对象赋值给car时,在销毁的时候会调用派生类本身的析构函数
    };
    
    class tesla : public car{
    public:
        void echo(){ cout << " i am tesla " << endl; }
        ~tesla();
    };
    
    class byd : public car{
    public:
        void echo(){ cout << " i am byd " << endl;}
        ~byd();
    };
    
    class factory{
    public:    
      car* create_car(CARTYPE type);
    };
    
    car*
    factory::create_car(CARTYPE type){
        switch(type){
            case byd_type:
                return new byd();
                break;
            case tesla_type:
                return new tesla();
                break;
            default:
                return nullptr;
                break;
        }
    }
    
    
    int main()
    {
        
        factory f;
        auto cars = f.create_car(byd_type);
        cars->echo();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    看了上述代码我们会发现简单工厂会非常好理解,但是有一些细节比如为什么我们将派生类(byd,tesla)赋值给基类(car)的时候我们的car的析构函数要加上virtual关键字?这个请看这里

  • 相关阅读:
    后端开发工程师开发规范
    Vue2源码学习笔记 - 5.options选项合并
    Vue2:组件进阶
    Semantic Kernel .NET SDK 的 v1.0.0 Beta1 发布
    金仓数据库KingbaseES整型与浮点类型数据比较隐式转换规则
    Java项目:SSM在线蛋糕商城销售网站项目
    使用单调队列解决 “滑动窗口最大值” 问题
    Visual Stdio 2019 win10 64bit下 无法找到 资源编译器DLL,请确认路径是否正确,和无法下载 win10SDK_10.0
    利用SCRM进行精细化社群运营
    微信核酸检测预约小程序系统毕业设计毕设(4)开题报告
  • 原文地址:https://blog.csdn.net/qq_37026934/article/details/126692231