前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识_设计模式

基础知识_设计模式

作者头像
yifei_
发布2022-11-14 14:53:09
1760
发布2022-11-14 14:53:09
举报
文章被收录于专栏:yifei的专栏yifei的专栏

文章目录

  1. 1. 单例模式
    1. 1.1. 懒汉式
    2. 1.2. 饿汉式
  2. 2. Oberver观察者模式

记录一下常见的设计模式的实现方法(Cpp实现)。

单例模式

当只允许类创建一个实例的时候,可以使用单例模式。

懒汉式
  • 懒汉式是在需要创建实例的时候才创建。
  • 将构造函数设置为私有可以组织创建对象,然后通过static函数从内部调用构造函数。

线程不安全

代码语言:javascript
复制
#include <iostream>
using namespace std;
class Singleton{
public:
    static Singleton * getInstance(){
        if(pinstance==nullptr){
            pinstance=new Singleton;
        }
        return pinstance;
    }

private:
    Singleton(){}
    ~Singleton(){}
    Singleton(const Singleton &s);
    const Singleton &operator=(const Singleton &s);
private:
	static Singleton *pinstance;

};

Singleton * Singleton::pinstance=nullptr;

int main(){
    Singleton *s1=Singleton::getInstance();
    Singleton *s2=Singleton::getInstance();
    if(s1==s2){
        cout<<"s1==s2"<<endl;
    }
    return 0;
}

线程安全

代码语言:javascript
复制
#include <iostream>
#include <mutex>
using namespace std;
class Singleton{
public:
    static Singleton * getInstance(){
        if(pinstance==nullptr){
            std::lock_guard<std::mutex> lock(mutex1);
            if(pinstance==nullptr){
                pinstance=new Singleton;
            }
        }
        return pinstance;
    }

private:
    Singleton(){}
    ~Singleton(){}
    Singleton(const Singleton &s);
    const Singleton &operator=(const Singleton &s);
private:
	static Singleton *pinstance;
    static std::mutex mutex1;
};

Singleton * Singleton::pinstance=nullptr;
std::mutex Singleton::mutex1;

int main(){
    Singleton *s1=Singleton::getInstance();
    Singleton *s2=Singleton::getInstance();
    if(s1==s2){
        cout<<"s1==s2"<<endl;
    }
    return 0;
}

effective c++中的实现

代码语言:javascript
复制

饿汉式

饿汉式是程序运行的时候马上就创建。

代码语言:javascript
复制
//本身就线程安全
#include <iostream>
using namespace std;
class Singleton{
public:
    static Singleton * getInstance(){
        return pinstance;
    }

private:
    Singleton(){}
    ~Singleton(){}
    Singleton(const Singleton &s);
    const Singleton &operator=(const Singleton &s);
private:
	static Singleton *pinstance;

};

Singleton * Singleton::pinstance=new (std::nothrow)Singleton;

int main(){
    Singleton *s1=Singleton::getInstance();
    Singleton *s2=Singleton::getInstance();
    if(s1==s2){
        cout<<"s1==s2"<<endl;
    }
    return 0;
}

Oberver观察者模式

观察者模式又叫发布订阅模式,在被观察者发生改变时,多个观察者应当能发现其变化。

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

class Observer;

//被观察者
class Subject{
public:
    Subject(int a):state(a){}
    void addObserver(Observer *obs){
        observers.push_back(obs);
    }
    void delObserver(Observer *obs){
        observers.remove(obs);
    }
    int getState(){
        return state;
    }
    void setState(int _state){
        state=_state;
    }
    void notifyAll();
private:
    int state;
    list<Observer*> observers;
};

//观察者-虚基类
class Observer{
public:
    Observer(Subject *sub):_subject(sub){}
    virtual void update()=0;
protected:
    Subject *_subject;
};

//观察者1
class Observer1:public Observer{
public:
    Observer1(Subject *sub):Observer(sub){}
    void update() override{
        cout<<"Observer1: "<<_subject->getState()<<endl;
    }
};

//观察者2
class Observer2:public Observer{
public:
    Observer2(Subject *sub):Observer(sub){}
    void update() override{
        cout<<"Observer2: "<<_subject->getState()<<endl;
    }
};

/* 注意Observer类进行了前向声明,但是不能访问其类内成员
 * 在Oberver类的定义之后,a才能访问其update()方法.
 */
void Subject::notifyAll(){
    for(auto a:observers){
        a->update();
    }
}

int main(){
    Subject *sub1=new Subject(10);
    Observer1 *obs1=new Observer1(sub1);
    Observer2 *obs2=new Observer2(sub1);

    sub1->addObserver(obs1);
    sub1->addObserver(obs2);

    cout<<"init:state="<<sub1->getState()<<endl;
    cout<<"set:state=20"<<endl;

    sub1->setState(20);

    sub1->notifyAll();

    delete sub1;
    delete obs1;
    delete obs2;

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单例模式
    • 懒汉式
      • 饿汉式
      • Oberver观察者模式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档