C++ 中 10 种常见设计模式实现

C++ 中 10 种常见设计模式实现

设计模式是软件开发中的一种常用技巧,它可以帮助我们编写更加优秀、更易于维护的代码。在本文中,我们将介绍 C++ 中 10 种常见的设计模式,并给出它们的实现。

1. 单例模式

单例模式是一种常用的设计模式,它用于确保一个类只有一个实例,并提供一个全局访问点。

下面是一个简单的单例模式实现:

#include <iostream>

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }

    void doSomething() {
        std::cout << "Singleton::doSomething()\n";
    }

private:
    Singleton() {}
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

int main() {
    Singleton::getInstance().doSomething();
    return 0;
}

2. 工厂方法模式

工厂方法模式是一种常用的创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪个类。

下面是一个简单的工厂方法模式实现:

#include <iostream>
#include <memory>

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

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

class ConcreteProductB : public Product {
public:
    void doSomething() override {
        std::cout << "ConcreteProductB::doSomething()\n";
    }
};

class Creator {
public:
    virtual ~Creator() {}
    virtual std::unique_ptr<Product> createProduct() = 0;
};

class ConcreteCreatorA : public Creator {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ConcreteProductA>();
    }
};

class ConcreteCreatorB : public Creator {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ConcreteProductB>();
    }
};

int main() {
    ConcreteCreatorA creatorA;
    auto productA = creatorA.createProduct();
    productA->doSomething();

    ConcreteCreatorB creatorB;
    auto productB = creatorB.createProduct();
    productB->doSomething();

    return 0;
}

3. 抽象工厂模式

抽象工厂模式是一种常用的创建型设计模式,它提供了一种方式来封装一组相关或相互依赖的对象创建过程。

下面是一个简单的抽象工厂模式实现:

#include <iostream>
#include <memory>

class AbstractProductA {
public:
    virtual ~AbstractProductA() {}
    virtual void doSomethingA() = 0;
};

class AbstractProductB {
public:
    virtual ~AbstractProductB() {}
    virtual void doSomethingB() = 0;
};

class ConcreteProductA1 : public AbstractProductA {
public:
    void doSomethingA() override {
        std::cout << "ConcreteProductA1::doSomethingA()\n";
    }
};

class ConcreteProductA2 : public AbstractProductA {
public:
    void doSomethingA() override {
        std::cout << "ConcreteProductA2::doSomethingA()\n";
    }
};

class ConcreteProductB1 : public AbstractProductB {
public:
    void doSomethingB() override {
        std::cout << "ConcreteProductB1::doSomethingB()\n";
    }
};

class ConcreteProductB2 : public AbstractProductB {
public:
    void doSomethingB() override {
        std::cout << "ConcreteProductB2::doSomethingB()\n";
    }
};

class AbstractFactory {
public:
    virtual ~AbstractFactory() {}
    virtual std::unique_ptr<AbstractProductA> createProductA() = 0;
    virtual std::unique_ptr<AbstractProductB> createProductB() = 0;
};

class ConcreteFactory1 : public AbstractFactory {
public:
    std::unique_ptr<AbstractProductA> createProductA() override {
        return std::make_unique<ConcreteProductA1>();
    }

    std::unique_ptr<AbstractProductB> createProductB() override {
        return std::make_unique<ConcreteProductB1>();
    }
};

class ConcreteFactory2 : public AbstractFactory {
public:
    std::unique_ptr<AbstractProductA> createProductA() override {
        return std::make_unique<ConcreteProductA2>();
    }

    std::unique_ptr<AbstractProductB> createProductB() override {
        return std::make_unique<ConcreteProductB2>();
    }
};

int main() {
    ConcreteFactory1 factory1;
    auto productA1 = factory1.createProductA();
    auto productB1 = factory1.createProductB();
    productA1->doSomethingA();
    productB1->doSomethingB();

    ConcreteFactory2 factory2;
    auto productA2 = factory2.createProductA();
    auto productB2 = factory2.createProductB();
    productA2->doSomethingA();
    productB2->doSomethingB();

    return 0;
}

4. 建造者模式

建造者模式是一种常用的创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

下面是一个简单的建造者模式实现:

#include <iostream>
#include <memory>
#include <string>

class Product {
public:
    void setPartA(const std::string& partA) {
        partA_ = partA;
    }

    void setPartB(const std::string& partB) {
        partB_ = partB;
    }

    void setPartC(const std::string& partC) {
        partC_ = partC;
    }

    void show() {
        std::cout << "PartA: " << partA_ << '\n';
        std::cout << "PartB: " << partB_ << '\n';
        std::cout << "PartC: " << partC_ << '\n';
    }

private:
    std::string partA_;
    std::string partB_;
    std::string partC_;
};

class Builder {
public:
    virtual ~Builder() {}
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual void buildPartC() = 0;
    virtual std::unique_ptr<Product> getResult() = 0;
};

class ConcreteBuilder : public Builder {
public:
    ConcreteBuilder() : product_(std::make_unique<Product>()) {}

    void buildPartA() override {
        product_->setPartA("Part A");
    }

    void buildPartB() override {
        product_->setPartB("Part B");
    }

    void buildPartC() override {
        product_->setPartC("Part C");
    }

    std::unique_ptr<Product> getResult() override {
        return std::move(product_);
    }

private:
  <std::unique_ptr<Product> product_;
};

class Director {
public:
    void setBuilder(std::unique_ptr<Builder> builder) {
        builder_ = std::move(builder);
    }

    std::unique_ptr<Product> construct() {
        builder_->buildPartA();
        builder_->buildPartB();
        builder_->buildPartC();
        return builder_->getResult();
    }

private:
    std::unique_ptr<Builder> builder_;
};

int main() {
    Director director;
    director.setBuilder(std::make_unique<ConcreteBuilder>());
    auto product = director.construct();
    product->show();
    return 0;
}

5. 原型模式

原型模式是一种常用的创建型设计模式,它通过复制现有的对象来创建新的对象。

下面是一个简单的原型模式实现:

#include <iostream>
#include <memory>
#include <unordered_map>

class Prototype {
public:
    virtual ~Prototype() {}
    virtual std::unique_ptr<Prototype> clone() = 0;
};

class ConcretePrototypeA : public Prototype {
public:
    ConcretePrototypeA(int x) : x_(x) {}

    std::unique_ptr<Prototype> clone() override {
        return std::make_unique<ConcretePrototypeA>(*this);
    }

    void show() {
        std::cout << "ConcretePrototypeA: " << x_ << '\n';
    }

private:
    int x_;
};

class ConcretePrototypeB : public Prototype {
public:
    ConcretePrototypeB(int x) : x_(x) {}

    std::unique_ptr<Prototype> clone() override {
        return std::make_unique<ConcretePrototypeB>(*this);
    }

    void show() {
        std::cout << "ConcretePrototypeB: " << x_ << '\n';
    }

private:
    int x_;
};

class PrototypeManager {
public:
    void addPrototype(const std::string& name, std::unique_ptr<Prototype> prototype) {
        prototypes_[name] = std::move(prototype);
    }

    std::unique_ptr<Prototype> getPrototype(const std::string& name) {
        return prototypes_.at(name)->clone();
    }

private:
    std::unordered_map<std::string, std::unique_ptr<Prototype>> prototypes_;
};

int main() {
    PrototypeManager manager;
    manager.addPrototype("A", std::make_unique<ConcretePrototypeA>(1));
    manager.addPrototype("B", std::make_unique<ConcretePrototypeB>(2));

    auto prototypeA = manager.getPrototype("A");
    static_cast<ConcretePrototypeA*>(prototypeA.get())->show();

    auto prototypeB = manager.getPrototype("B");
    static_cast<ConcretePrototypeB*>(prototypeB.get())->show();

    return 0;
}

6. 适配器模式

适配器模式是一种常用的结构型设计模式,它允许我们将一个类的接口转换为客户端期望的另一个接口。

下面是一个简单的适配器模式实现:

#include <iostream>

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

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

class Adapter : public Target {
public:
    Adapter(Adaptee* adaptee) : adaptee_(adaptee) {}

    void request() override {
        adaptee_->specificRequest();
    }

private:
  Adaptee* adaptee_;
};

int main() {
  Adaptee adaptee;
  Adapter adapter(&adaptee);
  adapter.request();
  return 0;
}

7. 桥接模式

桥接模式是一种常用的结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。

下面是一个简单的桥接模式实现:

#include <iostream>
#include <memory>

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

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

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

class Abstraction {
public:
  Abstraction(std::unique_ptr<Implementor> implementor)
      : implementor_(std::move(implementor)) {}

  virtual ~Abstraction() {}
  virtual void operation() = 0;

protected:
  std::unique_ptr<Implementor> implementor_;
};

class RefinedAbstraction : public Abstraction {
public:
  using Abstraction::Abstraction;

  void operation() override {
      implementor_->operationImpl();
  }
};

int main() {
  RefinedAbstraction abstraction1(std::make_unique<ConcreteImplementorA>());
  abstraction1.operation();

  RefinedAbstraction abstraction2(std::make_unique<ConcreteImplementorB>());
  abstraction2.operation();

  return 0;
}

8. 组合模式

组合模式是一种常用的结构型设计模式,它允许我们将对象组合成树形结构来表示部分-整体的层次结构。

下面是一个简单的组合模式实现:

#include <iostream>
#include <memory>
#include <vector>

class Component {
public:
    virtual ~Component() {}
    virtual void operation() = 0;
    virtual void add(std::unique_ptr<Component> component) {}
    virtual void remove(Component* component) {}
    virtual Component* getChild(int index) { return nullptr; }
};

class Leaf : public Component {
public:
    Leaf(int id) : id_(id) {}

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

private:
    int id_;
};

class Composite : public Component {
public:
    void operation() override {
        std::cout << "Composite::operation()\n";
        for (const auto& component : components_) {
            component->operation();
        }
    }

    void add(std::unique_ptr<Component> component) override {
        components_.push_back(std::move(component));
    }

    void remove(Component* component) override {
        components_.erase(std::remove_if(components_.begin(), components_.end(),
                                         [&](const auto& c) { return c.get() == component; }),
                          components_.end());
    }

    Component* getChild(int index) override {
        return components_[index].get();
    }

private:
    std::vector<std::unique_ptr<Component>> components_;
};

int main() {
    Composite composite;
    composite.add(std::make_unique<Leaf>(1));
    composite.add(std::make_unique<Leaf>(2));
    composite.operation();
    return 0;
}

9. 装饰器模式

装饰器模式是一种常用的结构型设计模式,它允许我们动态地给一个对象添加额外的职责。

下面是一个简单的装饰器模式实现:

#include <iostream>
#include <memory>

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

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

class Decorator : public Component {
public:
    Decorator(std::unique_ptr<Component> component)
        : component_(std::move(component)) {}

protected:
    std::unique_ptr<Component> component_;
};

class ConcreteDecoratorA : public Decorator {
public:
    using Decorator::Decorator;

    void operation() override {
        std::cout << "ConcreteDecoratorA::operation()\n";
        component_->operation();
    }
};

class ConcreteDecoratorB : public Decorator {
public:
    using Decorator::Decorator;

    void operation() override {
        std::cout << "ConcreteDecoratorB::operation()\n";
        component_->operation();
    }
};

int main() {
    ConcreteDecoratorB decoratorB(
        std::make_unique<ConcreteDecoratorA>(
            std::make_unique<ConcreteComponent>()));
    decoratorB.operation();
    return 0;
}

10. 外观模式

外观模式是一种常用的结构型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更容易使用。

下面是一个简单的外观模式实现:

#include <iostream>

class SubsystemA {
public:
  void operationA() {
      std::cout << "SubsystemA::operationA()\n";
  }
};

class SubsystemB {
public:
  void operationB() {
      std::cout << "SubsystemB::operationB()\n";
      }
};

class Facade {
public:
  Facade(SubsystemA* subsystemA, SubsystemB* subsystemB)
      : subsystemA_(subsystemA), subsystemB_(subsystemB) {}

  void operation() {
      subsystemA_->operationA();
      subsystemB_->operationB();
  }

private:
  SubsystemA* subsystemA_;
  SubsystemB* subsystemB_;
};

int main() {
  SubsystemA subsystemA;
  SubsystemB subsystemB;
  Facade facade(&subsystemA, &subsystemB);
  facade.operation();
  return 0;
}

总之,设计模式是软件开发中的一种常用技巧,它可以帮助我们编写更加优秀、更易于维护的代码。希望本文能够帮助你更好地掌握 C++ 中的设计模式。


希望这篇博客草稿对你有所帮助!如果你还有其他问题,请随时告诉我。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工厂模式是一常见的创建型设计模式,用于创建对象,而不是通过直接调用构造函数来创建它们。工厂模式定义了一个接口,用于创建相关对象,但是让子类决定要实例化的类。在C++,工厂模式可以通过以下步骤实现: 1. 创建一个抽象基类,该类定义了一个纯虚拟函数,该函数将返回一个指向基类的指针。这个基类就是我们的工厂接口。 ```c++ class Product { public: virtual ~Product() {} virtual void operation() = 0; }; ``` 2. 创建具体的产品类,它们继承自抽象基类,并实现了其纯虚拟函数。这些类就是我们的具体产品。 ```c++ class ConcreteProductA : public Product { public: void operation() override { /* 具体产品 A 的操作 */ } }; class ConcreteProductB : public Product { public: void operation() override { /* 具体产品 B 的操作 */ } }; ``` 3. 创建一个工厂类,该类实现了工厂接口,并根据需要创建具体的产品。这个工厂类就是我们的具体工厂。 ```c++ class Factory { public: virtual ~Factory() {} virtual std::unique_ptr<Product> createProduct() = 0; }; class ConcreteFactoryA : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductA>(); } }; class ConcreteFactoryB : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductB>(); } }; ``` 4. 在客户端代码使用具体工厂创建具体产品。 ```c++ int main() { std::unique_ptr<Factory> factory = std::make_unique<ConcreteFactoryA>(); std::unique_ptr<Product> product = factory->createProduct(); product->operation(); return 0; } ``` 这就是工厂模式的基本实现方式。通过这方式,我们可以将对象的创建过程与客户端代码分离,从而更好地实现模块化和可扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值