工厂方法模式(Factory Method)

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。这样,工厂方法将对象的创建过程延迟到子类中进行。

1. 工厂方法模式的结构

工厂方法模式包含以下几个主要组件:

  • Product(产品): 定义了工厂方法创建的对象的接口或抽象类。
  • ConcreteProduct(具体产品): 实现了 Product 接口或继承自抽象类的具体对象。
  • Creator(创建者): 声明了返回 Product 类型的工厂方法,且可以包含调用工厂方法以创建对象的逻辑。
  • ConcreteCreator(具体创建者): 实现了工厂方法,返回具体的 ConcreteProduct 实例。

2. Mermaid 关系图

以下是工厂方法模式的类图,用 Mermaid 表示:

classDiagram
    class Product {
        <<abstract>>
        + operation() : void
    }

    class ConcreteProductA {
        + operation() : void
    }

    class ConcreteProductB {
        + operation() : void
    }

    class Creator {
        <<abstract>>
        + factoryMethod() : Product
        + someOperation() : void
    }

    class ConcreteCreatorA {
        + factoryMethod() : Product
    }

    class ConcreteCreatorB {
        + factoryMethod() : Product
    }

    Product <|-- ConcreteProductA
    Product <|-- ConcreteProductB
    Creator <|-- ConcreteCreatorA
    Creator <|-- ConcreteCreatorB
    Creator --> Product : "创建"
    ConcreteCreatorA --> ConcreteProductA : "创建"
    ConcreteCreatorB --> ConcreteProductB : "创建"

3. 工厂方法模式的实现

Product 抽象类:

class Product {
public:
    virtual void operation() const = 0;
    virtual ~Product() = default;
};

ConcreteProductA 具体产品:

class ConcreteProductA : public Product {
public:
    void operation() const override {
        std::cout << "Operation by ConcreteProductA\n";
    }
};

ConcreteProductB 具体产品:

class ConcreteProductB : public Product {
public:
    void operation() const override {
        std::cout << "Operation by ConcreteProductB\n";
    }
};

Creator 抽象类:

class Creator {
public:
    virtual ~Creator() = default;

    // 工厂方法
    virtual Product* factoryMethod() const = 0;

    void someOperation() const {
        Product* product = this->factoryMethod();
        product->operation();
        delete product;
    }
};

ConcreteCreatorA 具体创建者:

class ConcreteCreatorA : public Creator {
public:
    Product* factoryMethod() const override {
        return new ConcreteProductA();
    }
};

ConcreteCreatorB 具体创建者:

class ConcreteCreatorB : public Creator {
public:
    Product* factoryMethod() const override {
        return new ConcreteProductB();
    }
};

4. 使用工厂方法模式

在客户端代码中,创建具体产品的细节通过调用创建者的工厂方法来隐藏。示例:

void ClientCode(const Creator& creator) {
    creator.someOperation();
}

int main() {
    Creator* creatorA = new ConcreteCreatorA();
    ClientCode(*creatorA);

    Creator* creatorB = new ConcreteCreatorB();
    ClientCode(*creatorB);

    delete creatorA;
    delete creatorB;
    return 0;
}

5. 总结

工厂方法模式通过将对象的创建延迟到子类中,遵循了开放/封闭原则,增加了系统的灵活性和可扩展性。Mermaid 类图清晰地展示了类之间的关系,有助于理解这种模式的结构和实现。