在軟件工程中,設計模式是為了解決常見的軟件設計問題而形成的一套經典解決方案。這些模式不僅能夠幫助開發者提高設計的靈活性和代碼的重用性,還能使問題的解決方案更加清晰、易于理解。《設計模式精解-GoF 23種設計模式》一書中所列舉的23種設計模式,是由四位作者(即GoF,Gang of Four)提出的,至今仍被廣泛應用在各種軟件開發項目中。本文將對這些設計模式進行全面解析,每種模式均配以C++代碼示例,旨在為讀者提供一個清晰、系統的學習路徑。
創建型模式(Creational Patterns)
創建型模式涉及對象的創建機制,旨在創建對象時增加系統的靈活性和效率。
工廠模式(Factory Pattern)
工廠模式通過定義一個用于創建對象的接口,讓子類決定實例化哪一個類。這樣的方式允許在不明確指定具體類的情況下創建對象。
class Product {
public:virtual ~Product() {}virtual std::string Operation() const = 0;
};class ConcreteProduct1 : public Product {
public:std::string Operation() const override {return "Result of ConcreteProduct1";}
};class Creator {
public:virtual ~Creator(){}virtual Product* FactoryMethod() const = 0;std::string SomeOperation() const {Product* product = this->FactoryMethod();std::string result = "Creator: The same creator's code has just worked with " + product->Operation();delete product;return result;}
};
抽象工廠模式(Abstract Factory Pattern)
抽象工廠模式提供一個接口,用于創建相關或依賴對象的家族,而不需要明確指定具體類。
class AbstractProductA {
public:virtual ~AbstractProductA(){};virtual std::string UsefulFunctionA() const = 0;
};class AbstractProductB {
public:virtual ~AbstractProductB(){};virtual std::string UsefulFunctionB() const = 0;virtual std::string AnotherUsefulFunctionB(const AbstractProductA& collaborator) const = 0;
};class ConcreteProductA1 : public AbstractProductA {
public:std::string UsefulFunctionA() const override {return "The result of the product A1.";}
};class ConcreteProductB1 : public AbstractProductB {
public:std::string UsefulFunctionB() const override {return "The result of the product B1.";}std::string AnotherUsefulFunctionB(const AbstractProductA& collaborator) const override {const std::string result = collaborator.UsefulFunctionA();return "The result of the B1 collaborating with ( " + result + " )";}
};
單例模式(Singleton Pattern)
單例模式確保一個類只有一個實例,并提供一個全局訪問點。
class Singleton {
protected:Singleton(const std::string value): value_(value) {}static Singleton* singleton_;std::string value_;public:Singleton(Singleton &other) = delete;void operator=(const Singleton &) = delete;static Singleton *GetInstance(const std::string& value);std::string value() const{return value_;}
};Singleton* Singleton::singleton_ = nullptr;;Singleton *Singleton::GetInstance(const std::string& value) {if(singleton_ == nullptr){singleton_ = new Singleton(value);}return singleton_;
}
建造者模式(Builder Pattern)
建造者模式使用多個簡單的對象一步一步構建成一個復雜的對象。
class Product1 {
public:std::vector<std::string> parts_;void ListParts()const {std::cout << "Product parts: ";for (size_t i = 0; i < parts_.size(); i++) {if (parts_[i] == parts_.back()) {std::cout << parts_[i];} else {std::cout << parts_[i] << ", ";}}std::cout << "\n\n";}
};class Builder {
public:virtual ~Builder() {}virtual void ProducePartA() const = 0;virtual void ProducePartB() const = 0;virtual void ProducePartC() const = 0;
};class ConcreteBuilder1 : public Builder {
private:Product1* product;public:ConcreteBuilder1() {this->Reset();}~ConcreteBuilder1() {delete product;}void Reset() {this->product = new Product1();}void ProducePartA()const override {this->product->parts_.push_back("PartA1");}void ProducePartB()const override {this->product->parts_.push_back("PartB1");}void ProducePartC()const override {this->product->parts_.push_back("PartC1");}Product1* GetProduct() {Product1* result = this->product;this->Reset();return result;}
};
原型模式(Prototype Pattern)
原型模式使用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
class Prototype {
protected:std::string prototype_name_;float prototype_field_;public:Prototype() {}Prototype(std::string prototype_name): prototype_name_(prototype_name) {}virtual ~Prototype() {}virtual Prototype *clone() const = 0;virtual void Method(float prototype_field) {this->prototype_field_ = prototype_field;std::cout << "Call Method from " << this->prototype_name_ << " with field : " << this->prototype_field_ << std::endl;}
};class ConcretePrototype1 : public Prototype {
private:float concrete_prototype_field1_;public:ConcretePrototype1(std::string prototype_name, float concrete_prototype_field): Prototype(prototype_name), concrete_prototype_field1_(concrete_prototype_field) {}Prototype *clone() const override {return new ConcretePrototype1(*this);}
};class ConcretePrototype2 : public Prototype {
private:float concrete_prototype_field2_;public:ConcretePrototype2(std::string prototype_name, float concrete_prototype_field): Prototype(prototype_name), concrete_prototype_field2_(concrete_prototype_field) {}Prototype *clone() const override {return new ConcretePrototype2(*this);}
};
結構型模式(Structural Patterns)
結構型模式關注于對象組合,它們利用繼承和接口的方式來組合接口或實現以提供新的功能。
橋接模式(Bridge Pattern)
橋接模式通過將抽象部分與實現部分分離,使它們可以獨立變化。
class Implementation {
public:virtual ~Implementation() {}virtual std::string OperationImplementation() const = 0;
};class ConcreteImplementationA : public Implementation {
public:std::string OperationImplementation() const override {return "ConcreteImplementationA: Here's the result on the platform A.\n";}
};class ConcreteImplementationB : public Implementation {
public:std::string OperationImplementation() const override {return "ConcreteImplementationB: Here's the result on the platform B.\n";}
};class Abstraction {
protected:Implementation* implementation_;public:Abstraction(Implementation* implementation) : implementation_(implementation) {}virtual ~Abstraction() {}virtual std::string Operation() const {return "Abstraction: Base operation with:\n" +this->implementation_->OperationImplementation();}
};class ExtendedAbstraction : public Abstraction {
public:ExtendedAbstraction(Implementation* implementation) : Abstraction(implementation) {}std::string Operation() const override {return "ExtendedAbstraction: Extended operation with:\n" + this->implementation_->OperationImplementation();}
};
適配器模式(Adapter Pattern)
適配器模式允許不兼容的接口之間的通信,它通過將一個類的接口轉換成客戶期望的另一個接口來實現。
class Target {
public:virtual ~Target() {}virtual std::string Request() const {return "Target: The default target's behavior.";}
};class Adaptee {
public:std::string SpecificRequest() const {return ".eetpadA eht fo roivaheb laicepS";}
};class Adapter : public Target {
private:Adaptee* adaptee_;public:Adapter(Adaptee* adaptee) : adaptee_(adaptee) {}std::string Request() const override {std::string to_reverse = this->adaptee_->SpecificRequest();std::reverse(to_reverse.begin(), to_reverse.end());return "Adapter: (TRANSLATED) " + to_reverse;}
};
裝飾器模式(Decorator Pattern)
裝飾器模式允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,因為這種模式通過創建一個裝飾類來包裝原有的類。
class Component {
public:virtual ~Component() {}virtual std::string Operation() const = 0;
};class ConcreteComponent : public Component {
public:std::string Operation() const override {return "ConcreteComponent";}
};class Decorator : public Component {
protected:Component* component_;public:Decorator(Component* component) : component_(component) {}std::string Operation() const override {return this->component_->Operation();}
};class ConcreteDecoratorA : public Decorator {
public:ConcreteDecoratorA(Component* component) : Decorator(component) {}std::string Operation() const override {return "ConcreteDecoratorA(" + Decorator::Operation() + ")";}
};class ConcreteDecoratorB : public Decorator {
public:ConcreteDecoratorB(Component* component) : Decorator(component) {}std::string Operation() const override {return "ConcreteDecoratorB(" + Decorator::Operation() + ")";}
};
組合模式(Composite Pattern)
組合模式允許將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
class Component {
protected:Component* parent_;public:virtual ~Component() {}void SetParent(Component* parent) {this->parent_ = parent;}Component* GetParent() const {return this->parent_;}virtual void Add(Component* component) {}virtual void Remove(Component* component) {}virtual bool IsComposite() const {return false;}virtual std::string Operation() const = 0;
};class Leaf : public Component {
public:std::string Operation() const override {return "Leaf";}
};class Composite : public Component {
protected:std::list<Component*> children_;public:void Add(Component* component) override {this->children_.push_back(component);component->SetParent(this);}void Remove(Component* component) override {children_.remove(component);component->SetParent(nullptr);}bool IsComposite() const override {return true;}std::string Operation() const override {std::string result;for (const Component* c : children_) {if (c == children_.back()) {result += c->Operation();} else {result += c->Operation() + "+";}}return "Branch(" + result + ")";}
};
享元模式(Flyweight Pattern)
享元模式是對象池的一種實現,它用于減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬于結構型模式,因為該模式提供了減少對象數量從而改善應用所需的對象結構的方式。
class Flyweight {
protected:std::string shared_state_;public:Flyweight(const std::string& shared_state) : shared_state_(shared_state) {}virtual ~Flyweight() {}virtual void Operation(const std::string& unique_state) const {std::cout << "Flyweight: Displaying shared (" << this->shared_state_ << ") and unique (" << unique_state << ") state.\n";}
};class FlyweightFactory {
private:std::unordered_map<std::string, Flyweight*> flyweights_;std::string GetKey(const std::vector<std::string>& state) const {std::string key;for (const std::string& s : state) {key += s;}return key;}public:FlyweightFactory(const std::vector<std::string>& initial_flyweights) {for (const std::string& state : initial_flyweights) {this->flyweights_.insert(std::make_pair<std::string, Flyweight*>(this->GetKey({state}), new Flyweight(state)));}}~FlyweightFactory() {for (auto pair : this->flyweights_) {delete pair.second;}this->flyweights_.clear();}Flyweight* GetFlyweight(const std::vector<std::string>& shared_state) {std::string key = this->GetKey(shared_state);if (this->flyweights_.find(key) == this->flyweights_.end()) {std::cout << "FlyweightFactory: Can't find a flyweight, creating new one.\n";this->flyweights_.insert(std::make_pair(key, new Flyweight(key)));} else {std::cout << "FlyweightFactory: Reusing existing flyweight.\n";}return this->flyweights_.at(key);}void ListFlyweights() const {size_t count = this->flyweights_.size();std::cout << "\nFlyweightFactory: I have " << count << " flyweights:\n";for (auto pair : this->flyweights_) {std::cout << pair.first << "\n";}}
};
外觀模式(Facade Pattern)
外觀模式提供了一個統一的接口,用來訪問子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。
class Subsystem1 {
public:std::string Operation1() const {return "Subsystem1: Ready!\n";}std::string OperationN() const {return "Subsystem1: Go!\n";}
};class Subsystem2 {
public:std::string Operation1() const {return "Subsystem2: Get ready!\n";}std::string OperationZ() const {return "Subsystem2: Fire!\n";}
};class Facade {
protected:Subsystem1* subsystem1_;Subsystem2* subsystem2_;public:Facade(Subsystem1* subsystem1 = nullptr,Subsystem2* subsystem2 = nullptr) {