C++工厂方法之对象创建型模式详解

C++工厂方法之对象创建型模式详解

什么是对象创建型模式

对象创建型模式是指通过专门定义的工厂方法来创建对象,并且将对象的创建延迟到子类中去实现。

对象创建型模式实现了解耦,即将构造运算与对象的使用分离开来,使得相同的构造过程可以创建不同的产品。

工厂方法模式

工厂方法模式(Factory Method)是对象创建型模式的一种,通过定义工厂接口和工厂的具体实现来创建产品。

工厂方法模式解决了简单工厂模式的缺点,可以在工厂接口和工厂实现类上进行扩展,从而提高系统的灵活性。

下面以一个简单的汽车工厂为例说明工厂方法模式的具体实现:

class Car {
public:
    virtual void drive() = 0;
};

class BenzCar : public Car {
public:
    void drive() {
        std::cout << "BenzCar is driving." << std::endl;
    }
};

class BMWCar : public Car {
public:
    void drive() {
        std::cout << "BMWCar is driving." << std::endl;
    }
};

class CarFactory {
public:
    virtual Car* createCar() = 0;
};

class BenzFactory : public CarFactory {
public:
    Car* createCar() {
        return new BenzCar();
    }
};

class BMWFactory : public CarFactory {
public:
    Car* createCar() {
        return new BMWCar();
    }
};

这个例子中,Car 是产品基类,BenzCarBMWCar 是具体的产品类,CarFactory 是工厂基类,BenzFactoryBMWFactory 是具体的工厂类。

对象池模式

对象池模式(Object Pool)是一种预先创建一定数量的对象,并对外提供访问接口的一种模式。

对象池可以避免频繁的创建对象和销毁对象,从而提高程序的性能。

下面以一个简单的线程池为例说明对象池的具体实现:

class ThreadPool {
public:
    ThreadPool(int size) {
        m_freeWorkers.resize(size);
        for (int i = 0; i < size; i++) {
            m_freeWorkers[i] = new Worker();
        }
    }

    void addTask(Task* task) {
        std::unique_lock<std::mutex> lock(m_mutex);
        while (m_queue.size() >= m_freeWorkers.size()) {
            m_cond.wait(lock);
        }
        m_queue.push(task);
        m_cond.notify_one();
    }

    void stop() {
        m_isStopped = true;
        m_cond.notify_all();
        for (auto worker : m_freeWorkers) {
            worker->stop();
        }
        for (auto worker : m_busyWorkers) {
            worker->stop();
        }
    }

private:
    class Worker {
    public:
        void operator()() {
            while (!m_isStopped) {
                Task* task = nullptr;
                {
                    std::unique_lock<std::mutex> lock(m_mutex);
                    while (m_queue.empty() && !m_isStopped) {
                        m_cond.wait(lock);
                    }
                    if (m_isStopped) {
                        break;
                    }
                    task = m_queue.front();
                    m_queue.pop();
                }
                task->run();
            }
        }

        void stop() {
            m_isStopped = true;
            m_cond.notify_one();
        }

    private:
        std::mutex m_mutex;
        std::condition_variable m_cond;
        std::queue<Task*> m_queue;
        bool m_isStopped = false;
    };

    std::mutex m_mutex;
    std::condition_variable m_cond;
    std::queue<Task*> m_queue;
    std::vector<Worker*> m_freeWorkers;
    std::vector<Worker*> m_busyWorkers;
    bool m_isStopped = false;
};

在这个例子中,我们使用了 ThreadPool 类来管理线程池,其中 Worker 类表示一个工作线程。

线程池在初始化时预先创建了一定数量的工作线程,并将它们保存在 m_freeWorkers 中。当需要执行任务时,从 m_freeWorkers 中取出一个空闲的工作线程执行任务,如果没有空闲的工作线程,则阻塞等待直到有空闲的工作线程。

当线程池停止时,则调用所有工作线程的 stop 方法通知它们停止工作。

总结

对象创建型模式是一种常用的设计模式,它通过专门定义的工厂方法来创建对象,将对象的创建延迟到子类中去实现,从而提高系统的灵活性和可维护性。

工厂方法模式是对象创建型模式的一种,通过定义工厂接口和工厂的具体实现来创建产品。对象池模式是一种预先创建一定数量的对象,并对外提供访问接口的一种模式,可以避免频繁的创建对象和销毁对象,从而提高程序的性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++工厂方法之对象创建型模式详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 如何使用bindgen将C语言头文件转换为Rust接口代码

    当我们想要在Rust中使用C语言编写的库时,我们需要将C语言的头文件转换为Rust代码。这时候,我们可以使用Bindgen工具,它可以根据C语言的头文件生成Rust代码,省去了手动编写Rust代码的麻烦。本文将详细介绍如何使用Bindgen将C语言头文件转换为Rust代码。 安装Bindgen 首先需要安装Bindgen工具,我们可以使用以下命令进行安装: …

    C 2023年5月23日
    00
  • C++对象的动态建立与释放详解

    C++对象的动态建立与释放详解 什么是动态建立和释放对象? 在C++中,创建一个对象可以采用两种方式: 静态建立方式:在栈上或全局区创建一个对象,例如: cpp MyClass obj1; //在栈上创建对象 MyClass* pObj2 = new MyClass(); //在堆上创建对象,动态分配内存 动态建立对象方式:使用new操作符,在堆上分配内存,…

    C 2023年5月22日
    00
  • 基于C语言实现的迷宫算法示例

    欢迎来到本站的“基于C语言实现的迷宫算法示例”攻略页面,本文将详细讲解如何使用C语言实现迷宫算法,并提供两个示例帮助您更好地理解该算法的实现过程。 算法简介 迷宫算法是一种基于深度优先搜索的算法,其本质上是在地图中寻找一条从起点到终点的路径。具体来说,该算法通过递归的方式尝试每个格子的四个方向,同时使用递归堆栈回溯到先前的格子。当所有的格子都被尝试后,该算法…

    C 2023年5月23日
    00
  • C++11、C++14、C++17、C++20常用新特性

    C++11、C++14、C++17、C++20是近年来的几个重要版本,它们都带来了许多新的特性,让C++编程更加现代化和高效。下面,我们一一解析这些版本的常用新特性。 C++11新特性 auto类型推导 使用auto关键字可以让编译器自动推导变量类型,从而简化代码。例如,下面的代码中,变量i的类型会根据右值根据推导出来: auto i = 42; Lambd…

    C 2023年5月23日
    00
  • makefile如何调用静态库的方法实现

    下面我会详细讲解makefile如何调用静态库的方法实现。 首先,让我们了解一下静态库和动态库的概念。 静态库:是一种链接(编译期)时归档库,它包含多个目标文件的归档文件。程序链接时这些目标文件的代码会被直接复制到可执行文件中,因此生成的可执行文件比较大。静态库的优点是使用起来比较方便,缺点是可执行文件比较大,占据较多的磁盘空间。 动态库:是一种在运行时(载…

    C 2023年5月23日
    00
  • 神乐千鹤在拳皇97、98中的高级用法

    神乐千鹤在拳皇97、98中的高级用法攻略 什么是神乐千鹤? 神乐千鹤是拳皇系列游戏中的一位角色,拥有快速的移动速度和敏捷的攻击方式。她在拳皇97和98中的操作难度较高,但是如果掌握了她的高级用法,就可以轻松地击败对手。 神乐千鹤的高级用法 1. 投掷连击 神乐千鹤的投掷连击是一种非常强大的攻击方式。要进行投掷连击,首先需要进行一次投掷攻击(按下前+C),然后…

    C 2023年5月22日
    00
  • C语言实现输入两个数字将其按从小到大输出的方法

    以下是C语言实现输入两个数字将其按从小到大输出的方法的攻略: 步骤一:设置两个变量,输入两个数字 例如: #include <stdio.h> int main() { int a, b; printf("请输入两个整数: "); scanf("%d %d", &a, &b); return…

    C 2023年5月23日
    00
  • Android Studio 4.0 稳定版发布了,牛逼功能一览

    Android Studio 4.0 稳定版发布了,牛逼功能一览 简介 Android Studio 是 Google 官方推出的一款 Android 应用开发工具,可以帮助开发者快速的创建 Android 应用,并提供了一些强大的工具和兼容性支持。最近,Google 推出了 Android Studio 的最新稳定版:Android Studio 4.0。…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部