c++常用设计模式

1、单例模式(Singleton):保证一个类只有一个实例,提供一个全局访问点;

class Singleton {
private:
    static Singleton* instance;
    Singleton() {}
 
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};
 
Singleton* Singleton::instance = nullptr;

单例模式:懒汉模式和饿汉模式
懒汉模式是指在第一次使用时才创建实例,而饿汉模式是在程序启动时就立即创建实例。
1.1 懒汉模式

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 在首次调用时创建实例
        return instance;
    }

    // 禁止复制和赋值操作
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {} // 私有构造函数,确保无法通过外部代码创建实例
};

1.2 饿汉模式

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 在程序启动时就创建实例
        return instance;
    }

    // 禁止复制和赋值操作
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {} // 私有构造函数,确保无法通过外部代码创建实例
};

注意:
示例中,getInstance() 函数返回对单例对象的引用,并且使用 static 变量确保只有一个实例被创建。需要注意的是,在多线程环境下,懒汉模式需要考虑线程安全性,可以使用加锁等方式来保证线程安全。而饿汉模式则不需要担心线程安全问题。

2、工厂模式(Factory):用于创建对象的一个接口,让子类决定实例化哪个类

class Product {
public:
    virtual void show() = 0;
};
 
class ConcreteProduct : public Product {
public:
    void show() override {
        std::cout << "ConcreteProduct Show" << std::endl;
    }
};
 
class Factory {
public:
    virtual Product* createProduct() = 0;
};
 
class ConcreteFactory : public Factory {
public:
    Product* createProduct() override {
        return new ConcreteProduct();
    }
};

3、观察者模式(Obeserver):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象

#include <iostream>
#include <list>
#include <string>
 
class Observer {
public:
    virtual void update(std::string message) = 0;
};
 
class ConcreteObserver : public Observer {
public:
    void update(std::string message) override {
        std::cout << "Received message: " << message << std::endl;
    }
};
 
class Subject {
private:
    std::list<Observer*> observers;
    std::string message;
 
public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }
 
    void notify() {
        for (auto observer : observers) {
            observer->update(message);
        }
    }
 
    void setMessage(std::string msg) {
        message = msg;
    }
};
 
int main() {
    Subject subject;
    Observer* observer = new ConcreteObserver();
    subject.attach(observer);
    subject.setMessage("Hello, World!");
    subject.notify();
    delete observer;
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值