C++中的工厂方法模式

59 篇文章 0 订阅
52 篇文章 1 订阅

目录

工厂方法模式(Factory Method Pattern)

实际应用

图形创建器(Graphic Creator)

数据库连接器(Database Connector)

文档处理器(Document Processor)

总结


工厂方法模式(Factory Method Pattern)

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到其子类。

实际应用

1. 当一个类不知道它所需要的对象的确切类型时。
2. 当一个类希望由其子类来指定创建对象时。
3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者的信息局部化时。

图形创建器(Graphic Creator)

在图形应用程序中,不同类型的图形(例如:圆形、方形、三角形)需要由特定的创建器类来创建。

#include <iostream>
#include <memory>

// 产品接口
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() = default;
};

// 具体产品:圆形
class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a Circle" << std::endl;
    }
};

// 具体产品:方形
class Square : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a Square" << std::endl;
    }
};

// 具体产品:三角形
class Triangle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a Triangle" << std::endl;
    }
};

// 创建者基类
class ShapeCreator {
public:
    virtual std::unique_ptr<Shape> createShape() = 0;
    virtual ~ShapeCreator() = default;
};

// 具体创建者:圆形创建器
class CircleCreator : public ShapeCreator {
public:
    std::unique_ptr<Shape> createShape() override {
        return std::make_unique<Circle>();
    }
};

// 具体创建者:方形创建器
class SquareCreator : public ShapeCreator {
public:
    std::unique_ptr<Shape> createShape() override {
        return std::make_unique<Square>();
    }
};

// 具体创建者:三角形创建器
class TriangleCreator : public ShapeCreator {
public:
    std::unique_ptr<Shape> createShape() override {
        return std::make_unique<Triangle>();
    }
};

int main() {
    std::unique_ptr<ShapeCreator> creator = std::make_unique<CircleCreator>();
    std::unique_ptr<Shape> shape = creator->createShape();
    shape->draw();

    creator = std::make_unique<SquareCreator>();
    shape = creator->createShape();
    shape->draw();

    creator = std::make_unique<TriangleCreator>();
    shape = creator->createShape();
    shape->draw();

    return 0;
}

数据库连接器(Database Connector)

在数据库应用程序中,不同类型的数据库(例如:MySQL、PostgreSQL、SQLite)需要由特定的创建器类来创建连接对象。

#include <iostream>
#include <memory>

// 产品接口
class DatabaseConnection {
public:
    virtual void connect() = 0;
    virtual ~DatabaseConnection() = default;
};

// 具体产品:MySQL连接
class MySQLConnection : public DatabaseConnection {
public:
    void connect() override {
        std::cout << "Connecting to MySQL Database" << std::endl;
    }
};

// 具体产品:PostgreSQL连接
class PostgreSQLConnection : public DatabaseConnection {
public:
    void connect() override {
        std::cout << "Connecting to PostgreSQL Database" << std::endl;
    }
};

// 具体产品:SQLite连接
class SQLiteConnection : public DatabaseConnection {
public:
    void connect() override {
        std::cout << "Connecting to SQLite Database" << std::endl;
    }
};

// 创建者基类
class DatabaseConnectionCreator {
public:
    virtual std::unique_ptr<DatabaseConnection> createConnection() = 0;
    virtual ~DatabaseConnectionCreator() = default;
};

// 具体创建者:MySQL连接创建器
class MySQLConnectionCreator : public DatabaseConnectionCreator {
public:
    std::unique_ptr<DatabaseConnection> createConnection() override {
        return std::make_unique<MySQLConnection>();
    }
};

// 具体创建者:PostgreSQL连接创建器
class PostgreSQLConnectionCreator : public DatabaseConnectionCreator {
public:
    std::unique_ptr<DatabaseConnection> createConnection() override {
        return std::make_unique<PostgreSQLConnection>();
    }
};

// 具体创建者:SQLite连接创建器
class SQLiteConnectionCreator : public DatabaseConnectionCreator {
public:
    std::unique_ptr<DatabaseConnection> createConnection() override {
        return std::make_unique<SQLiteConnection>();
    }
};

int main() {
    std::unique_ptr<DatabaseConnectionCreator> creator = std::make_unique<MySQLConnectionCreator>();
    std::unique_ptr<DatabaseConnection> connection = creator->createConnection();
    connection->connect();

    creator = std::make_unique<PostgreSQLConnectionCreator>();
    connection = creator->createConnection();
    connection->connect();

    creator = std::make_unique<SQLiteConnectionCreator>();
    connection = creator->createConnection();
    connection->connect();

    return 0;
}

文档处理器(Document Processor)

在文档处理应用程序中,不同类型的文档(例如:Word文档、PDF文档、HTML文档)需要由特定的创建器类来创建文档对象。

#include <iostream>
#include <memory>

// 产品接口
class Document {
public:
    virtual void open() = 0;
    virtual ~Document() = default;
};

// 具体产品:Word文档
class WordDocument : public Document {
public:
    void open() override {
        std::cout << "Opening Word Document" << std::endl;
    }
};

// 具体产品:PDF文档
class PDFDocument : public Document {
public:
    void open() override {
        std::cout << "Opening PDF Document" << std::endl;
    }
};

// 具体产品:HTML文档
class HTMLDocument : public Document {
public:
    void open() override {
        std::cout << "Opening HTML Document" << std::endl;
    }
};

// 创建者基类
class DocumentCreator {
public:
    virtual std::unique_ptr<Document> createDocument() = 0;
    virtual ~DocumentCreator() = default;
};

// 具体创建者:Word文档创建器
class WordDocumentCreator : public DocumentCreator {
public:
    std::unique_ptr<Document> createDocument() override {
        return std::make_unique<WordDocument>();
    }
};

// 具体创建者:PDF文档创建器
class PDFDocumentCreator : public DocumentCreator {
public:
    std::unique_ptr<Document> createDocument() override {
        return std::make_unique<PDFDocument>();
    }
};

// 具体创建者:HTML文档创建器
class HTMLDocumentCreator : public DocumentCreator {
public:
    std::unique_ptr<Document> createDocument() override {
        return std::make_unique<HTMLDocument>();
    }
};

int main() {
    std::unique_ptr<DocumentCreator> creator = std::make_unique<WordDocumentCreator>();
    std::unique_ptr<Document> document = creator->createDocument();
    document->open();

    creator = std::make_unique<PDFDocumentCreator>();
    document = creator->createDocument();
    document->open();

    creator = std::make_unique<HTMLDocumentCreator>();
    document = creator->createDocument();
    document->open();

    return 0;
}

总结

工厂方法模式通过定义一个创建对象的接口,将对象的实际创建工作推迟到子类中实现,从而实现了解耦和扩展性。这种模式在我们实际的项目开发中特别适用于需要创建不同类型对象的场景。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抽象工厂方法模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或依赖对象的家族,而无需指定它们具体的类。 在 C++ ,抽象工厂方法模式通常通过定义一个抽象基类来实现。这个抽象基类定义了一系列纯虚函数,用于创建不同类型的产品对象。然后,针对不同的产品族,创建具体的工厂类,这些工厂类实现了抽象基类定义的纯虚函数,用于创建具体的产品对象。 以下是一个简单的抽象工厂方法模式的示例代码: ```c++ // 抽象产品类 A class AbstractProductA { public: virtual void operationA() = 0; }; // 抽象产品类 B class AbstractProductB { public: virtual void operationB() = 0; }; // 具体产品类 A1 class ConcreteProductA1 : public AbstractProductA { public: void operationA() { std::cout << "ConcreteProductA1::operationA()" << std::endl; } }; // 具体产品类 A2 class ConcreteProductA2 : public AbstractProductA { public: void operationA() { std::cout << "ConcreteProductA2::operationA()" << std::endl; } }; // 具体产品类 B1 class ConcreteProductB1 : public AbstractProductB { public: void operationB() { std::cout << "ConcreteProductB1::operationB()" << std::endl; } }; // 具体产品类 B2 class ConcreteProductB2 : public AbstractProductB { public: void operationB() { std::cout << "ConcreteProductB2::operationB()" << std::endl; } }; // 抽象工厂类 class AbstractFactory { public: virtual AbstractProductA* createProductA() = 0; virtual AbstractProductB* createProductB() = 0; }; // 具体工厂类 1 class ConcreteFactory1 : public AbstractFactory { public: AbstractProductA* createProductA() { return new ConcreteProductA1(); } AbstractProductB* createProductB() { return new ConcreteProductB1(); } }; // 具体工厂类 2 class ConcreteFactory2 : public AbstractFactory { public: AbstractProductA* createProductA() { return new ConcreteProductA2(); } AbstractProductB* createProductB() { return new ConcreteProductB2(); } }; int main() { AbstractFactory* factory1 = new ConcreteFactory1(); AbstractProductA* productA1 = factory1->createProductA(); AbstractProductB* productB1 = factory1->createProductB(); productA1->operationA(); // 输出:ConcreteProductA1::operationA() productB1->operationB(); // 输出:ConcreteProductB1::operationB() AbstractFactory* factory2 = new ConcreteFactory2(); AbstractProductA* productA2 = factory2->createProductA(); AbstractProductB* productB2 = factory2->createProductB(); productA2->operationA(); // 输出:ConcreteProductA2::operationA() productB2->operationB(); // 输出:ConcreteProductB2::operationB() return 0; } ``` 在上面的示例代码,我们定义了两个抽象产品类 `AbstractProductA` 和 `AbstractProductB`,以及四个具体产品类 `ConcreteProductA1`、`ConcreteProductA2`、`ConcreteProductB1` 和 `ConcreteProductB2`。然后,我们定义了一个抽象工厂类 `AbstractFactory`,它包含两个纯虚函数,用于创建不同类型的产品对象。最后,我们定义了两个具体工厂类 `ConcreteFactory1` 和 `ConcreteFactory2`,它们分别实现了 `AbstractFactory` 定义的纯虚函数,用于创建具体的产品对象。 在 `main` 函数,我们首先创建了一个 `ConcreteFactory1` 对象,然后使用它创建了一个 `ConcreteProductA1` 和一个 `ConcreteProductB1` 对象,并调用了它们的成员函数。然后,我们创建了一个 `ConcreteFactory2` 对象,使用它创建了一个 `ConcreteProductA2` 和一个 `ConcreteProductB2` 对象,并调用了它们的成员函数。 通过这种方式,我们可以轻松地创建一系列相关或依赖对象的家族,并且无需指定它们具体的类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉夢志昂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值