c++设计模式

C++ 设计模式是解决常见软件设计问题的通用方法。设计模式提供了一种可复用的解决方案,帮助开发者构建可扩展、灵活且高效的代码。设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。下面介绍一些常见的设计模式以及它们的特点和适用场景。

一、创建型设计模式
创建型模式主要用于对象的创建,封装了对象实例化的过程,目的是提高代码的灵活性和可复用性。

  1. 单例模式(Singleton)
    定义:保证一个类只有一个实例,并提供全局访问点。

特点:

只有一个实例存在,且可以全局访问。
通过一个静态方法获取唯一实例。
应用场景:需要控制对象的唯一性,比如日志记录器、配置管理等。

示例:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 懒加载,线程安全
        return instance;
    }

private:
    Singleton() {} // 私有构造函数,禁止外部创建实例
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};
  1. 工厂方法模式(Factory Method)
    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

特点:

将对象的创建延迟到子类,避免直接使用 new 关键字。
子类可以扩展新的类而不修改现有代码。
应用场景:需要在运行时决定创建哪种类的对象。

示例:

class Product {
public:
    virtual void use() = 0;
};

class ConcreteProductA : public Product {
public:
    void use() override {
        std::cout << "Using Product A\n";
    }
};

class Factory {
public:
    virtual Product* createProduct() = 0;
};

class ConcreteFactoryA : public Factory {
public:
    Product* createProduct() override {
        return new ConcreteProductA();
    }
};
  1. 抽象工厂模式(Abstract Factory)
    定义:提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。

特点:

用于创建多个相互关联的对象。
客户端无需知道实际创建的是哪个类。
应用场景:适用于需要生成多种产品系列的场景,如不同操作系统的 UI 控件。

示例:

class AbstractFactory {
public:
    virtual Button* createButton() = 0;
    virtual Checkbox* createCheckbox() = 0;
};

class ConcreteFactory1 : public AbstractFactory {
public:
    Button* createButton() override {
        return new Button1();
    }

    Checkbox* createCheckbox() override {
        return new Checkbox1();
    }
};
  1. 建造者模式(Builder)
    定义:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

特点:

将对象的创建步骤分离出来,使得构建更加灵活。
用户可以控制构建的细节。
应用场景:构建复杂对象时,特别是对象包含多个组件的情况。

示例:

class Product {
public:
    void addPart(const std::string& part) {
        parts.push_back(part);
    }
    void show() const {
        for (const auto& part : parts) {
            std::cout << part << "\n";
        }
    }

private:
    std::vector<std::string> parts;
};

class Builder {
public:
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual Product* getResult() = 0;
};

class ConcreteBuilder : public Builder {
    Product* product = new Product();
public:
    void buildPartA() override {
        product->addPart("PartA");
    }
    void buildPartB() override {
        product->addPart("PartB");
    }
    Product* getResult() override {
        return product;
    }
};

二、结构型设计模式
结构型模式关心类或对象的组合关系,用来解决类之间的继承、组合、依赖等结构问题。

  1. 适配器模式(Adapter)
    定义:将一个类的接口转换为客户希望的另一个接口。

特点:

使不兼容的类能够协同工作。
通过增加适配器来实现不同类的兼容。
应用场景:需要使用现有类但其接口与目标不符时。

示例:

class Target {
public:
    virtual void request() = 0;
};

class Adaptee {
public:
    void specificRequest() {
        std::cout << "Specific request\n";
    }
};

class Adapter : public Target {
private:
    Adaptee* adaptee;
public:
    Adapter(Adaptee* a) : adaptee(a) {}
    void request() override {
        adaptee->specificRequest();
    }
};
  1. 桥接模式(Bridge)
    定义:将抽象部分与它的实现部分分离,使它们都可以独立变化。

特点:

通过组合而非继承来解决复杂的多维度变化问题。
抽象和实现可以独立扩展。
应用场景:当有多个维度的变化时(如形状、颜色),需要通过组合的方式降低复杂性。

示例:

class Implementor {
public:
    virtual void operationImpl() = 0;
};

class ConcreteImplementorA : public Implementor {
public:
    void operationImpl() override {
        std::cout << "Concrete Implementor A\n";
    }
};

class Abstraction {
protected:
    Implementor* impl;
public:
    Abstraction(Implementor* imp) : impl(imp) {}
    virtual void operation() {
        impl->operationImpl();
    }
};
  1. 组合模式(Composite)
    定义:将对象组合成树形结构以表示部分-整体的层次结构,使客户端可以以一致的方式处理单个对象和组合对象。

特点:

组合对象和单个对象具有相同的接口。
通过递归的方式处理对象集合。
应用场景:当需要处理树形结构的对象时,例如文件系统。

示例:

class Component {
public:
    virtual void operation() = 0;
};

class Leaf : public Component {
public:
    void operation() override {
        std::cout << "Leaf operation\n";
    }
};

class Composite : public Component {
private:
    std::vector<Component*> children;
public:
    void add(Component* component) {
        children.push_back(component);
    }
    void operation() override {
        for (auto& child : children) {
            child->operation();
        }
    }
};

三、行为型设计模式
行为型模式关注对象之间的交互和职责分配,常用于描述对象如何协同工作。

  1. 观察者模式(Observer)
    定义:定义对象间的一对多依赖,当一个对象改变状态时,所有依赖它的对象都会自动收到通知并更新。

特点:

提供了一种对象间的松耦合机制。
适用于一个对象状态变化需要通知多个对象的场景。
应用场景:事件处理系统、订阅-发布机制。

示例:

class Observer {
public:
    virtual void update() = 0;
};

class Subject {
    std::vector<Observer*> observers;
public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }
    void notify() {
        for (Observer* observer : observers) {
            observer->update();
        }
    }
};

class ConcreteObserver : public Observer {
public:
    void update() override {
        std::cout << "Observer updated\n";
    }
};
  1. 策略模式(Strategy)
    定义:定义一系列算法,把它们封装起来,并且使它们可以互换使用。

特点:

使算法可以独立于使用它的客户而独立变化。
提供了在运行时选择算法的灵活性。
应用场景:需要在运行时动态选择算法的场景,如不同的排序策略。

示例:

class Strategy {
public:
    virtual void algorithm() = 0;
};

class ConcreteStrategyA : public Strategy {
public:
    void algorithm() override {
        std::cout << "Algorithm A\n";
    }
};

class Context {
    Strategy* strategy;
public:
    Context(Strategy* s) : strategy(s) {}
    void setStrategy(Strategy* s) {
        strategy = s;
    }
    void executeStrategy() {
        strategy->algorithm();
    }
};

总结
设计模式是用于解决常见软件设计问题的最佳实践。通过学习这些模式,可以提高代码的可维护性、可扩展性和复用性。C++ 中常用的设计模式根据需求和应用场景选择合适的设计模式来优化项目设计,能够大大提升项目的质量和开发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值