首页 > 编程语言 >C++工厂模式全解析:从简单工厂到抽象工厂的进阶之路

C++工厂模式全解析:从简单工厂到抽象工厂的进阶之路

时间:2024-11-06 15:44:03浏览次数:4  
标签:return 进阶 createCar show C++ 工厂 unique public

在软件设计中,工厂模式(Factory Pattern)是一类创建型设计模式,用于将对象的创建过程和使用过程解耦。这种设计模式在面向对象编程中非常常见,特别是在构建复杂系统时,工厂模式可以使代码更加灵活、模块化、易于扩展。

工厂模式的主要类型包括:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(Abstract Factory)

以下,我们会详细介绍每种模式的概念、适用场景以及 C++ 实现方式。


1. 简单工厂模式

概念

简单工厂模式(Simple Factory)提供了一个创建对象的接口,根据不同的条件创建不同的对象。简单工厂模式通常使用一个独立的工厂类,通过传入参数来决定实例化哪个具体的类对象。

适用场景

当系统需要创建的对象较少,且没有复杂的继承结构时,简单工厂模式是一种快速实现的方案。但当类的种类增多时,简单工厂会变得臃肿。

C++ 实现

假设我们需要一个工厂来创建不同类型的“汽车”对象,包括CarACarB

#include <iostream>
#include <memory>
using namespace std;

// 抽象产品类
class Car {
public:
    virtual void show() = 0; // 纯虚函数
};

// 具体产品类 A
class CarA : public Car {
public:
    void show() override {
        cout << "This is Car A." << endl;
    }
};

// 具体产品类 B
class CarB : public Car {
public:
    void show() override {
        cout << "This is Car B." << endl;
    }
};

// 简单工厂类
class SimpleCarFactory {
public:
    static unique_ptr<Car> createCar(const string& type) {
        if (type == "A") {
            return make_unique<CarA>();
        } else if (type == "B") {
            return make_unique<CarB>();
        } else {
            return nullptr;
        }
    }
};

// 测试代码
int main() {
    auto carA = SimpleCarFactory::createCar("A");
    auto carB = SimpleCarFactory::createCar("B");

    if (carA) carA->show();
    if (carB) carB->show();

    return 0;
}

说明

  • SimpleCarFactory 类中使用静态方法 createCar 创建不同的汽车实例。
  • createCar 方法接收一个 string 类型的参数 type,通过判断 type 的值来返回不同的 Car 子类对象。
  • 客户端无需关心具体的类,只需调用工厂类来创建对象。

优缺点

  • 优点:客户端与具体类解耦,易于使用。
  • 缺点:增加新的产品类型需要修改工厂类,违反了开闭原则。

2. 工厂方法模式

概念

工厂方法模式(Factory Method Pattern)通过定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法模式将对象的实例化推迟到子类完成,属于典型的面向对象设计。

适用场景

当系统中存在复杂的对象层次结构,需要通过子类来实现实例化的细节时,可以使用工厂方法模式。

C++ 实现

假设我们有多种类型的汽车,每种汽车都有自己的工厂。

#include <iostream>
#include <memory>
using namespace std;

// 抽象产品类
class Car {
public:
    virtual void show() = 0;
};

// 具体产品类 A
class CarA : public Car {
public:
    void show() override {
        cout << "This is Car A." << endl;
    }
};

// 具体产品类 B
class CarB : public Car {
public:
    void show() override {
        cout << "This is Car B." << endl;
    }
};

// 抽象工厂类
class CarFactory {
public:
    virtual unique_ptr<Car> createCar() = 0; // 纯虚函数
};

// 具体工厂类 A
class CarAFactory : public CarFactory {
public:
    unique_ptr<Car> createCar() override {
        return make_unique<CarA>();
    }
};

// 具体工厂类 B
class CarBFactory : public CarFactory {
public:
    unique_ptr<Car> createCar() override {
        return make_unique<CarB>();
    }
};

// 测试代码
int main() {
    unique_ptr<CarFactory> factoryA = make_unique<CarAFactory>();
    unique_ptr<CarFactory> factoryB = make_unique<CarBFactory>();

    auto carA = factoryA->createCar();
    auto carB = factoryB->createCar();

    carA->show();
    carB->show();

    return 0;
}

说明

  • CarFactory 是抽象工厂类,定义了创建 Car 的接口。
  • CarAFactoryCarBFactory 是具体工厂类,实现了 createCar 方法,分别返回 CarACarB 实例。
  • 客户端只需使用工厂类生成产品对象,不必了解具体的实现细节。

优缺点

  • 优点:符合开闭原则,增加新产品时无需修改已有代码。
  • 缺点:每新增一种产品,需要创建对应的工厂类,增加了系统复杂性。

3. 抽象工厂模式

概念

抽象工厂模式(Abstract Factory Pattern)是工厂模式的扩展,提供一个接口,用于创建一组相关或相互依赖的对象。抽象工厂模式适合需要创建多种产品类型的系统。

适用场景

当系统中存在多个产品族,并且客户端需要使用其中某一产品族的所有产品时,可以使用抽象工厂模式。

C++ 实现

假设我们有不同系列的汽车和轮胎,每个系列的汽车使用特定的轮胎。

#include <iostream>
#include <memory>
using namespace std;

// 抽象产品类:Car
class Car {
public:
    virtual void show() = 0;
};

// 具体产品类:CarA
class CarA : public Car {
public:
    void show() override {
        cout << "This is Car A." << endl;
    }
};

// 具体产品类:CarB
class CarB : public Car {
public:
    void show() override {
        cout << "This is Car B." << endl;
    }
};

// 抽象产品类:Tire
class Tire {
public:
    virtual void type() = 0;
};

// 具体产品类:TireA
class TireA : public Tire {
public:
    void type() override {
        cout << "This is Tire A for Car A." << endl;
    }
};

// 具体产品类:TireB
class TireB : public Tire {
public:
    void type() override {
        cout << "This is Tire B for Car B." << endl;
    }
};

// 抽象工厂类
class AbstractCarFactory {
public:
    virtual unique_ptr<Car> createCar() = 0;
    virtual unique_ptr<Tire> createTire() = 0;
};

// 具体工厂类 A
class CarAFactory : public AbstractCarFactory {
public:
    unique_ptr<Car> createCar() override {
        return make_unique<CarA>();
    }
    unique_ptr<Tire> createTire() override {
        return make_unique<TireA>();
    }
};

// 具体工厂类 B
class CarBFactory : public AbstractCarFactory {
public:
    unique_ptr<Car> createCar() override {
        return make_unique<CarB>();
    }
    unique_ptr<Tire> createTire() override {
        return make_unique<TireB>();
    }
};

// 测试代码
int main() {
    unique_ptr<AbstractCarFactory> factoryA = make_unique<CarAFactory>();
    unique_ptr<AbstractCarFactory> factoryB = make_unique<CarBFactory>();

    auto carA = factoryA->createCar();
    auto tireA = factoryA->createTire();
    carA->show();
    tireA->type();

    auto carB = factoryB->createCar();
    auto tireB = factoryB->createTire();
    carB->show();
    tireB->type();

    return 0;
}

说明

  • AbstractCarFactory 是抽象工厂类,定义了创建 CarTire 的接口。
  • CarAFactoryCarBFactory 是具体工厂类,实现了 createCarcreateTire 方法,分别返回与其产品族相关的产品。
  • 客户端只需使用特定工厂类生成产品族中的对象,无需了解具体的实现。

优缺点

  • 优点:支持创建一系列

标签:return,进阶,createCar,show,C++,工厂,unique,public
From: https://blog.csdn.net/qq_50394172/article/details/143570461

相关文章

  • 算法网关视频分析网关室内消防逃生通道占用工厂企业消防安全AI视频智能监管解决方案
    在当前的企业运营中,消防安全管理是保障人员安全和企业资产不受损失的关键环节。然而,传统的消防安全监管方式往往面临着人力资源有限、技术手段不足等问题,导致无法及时有效地发现和处理潜在的火险隐患。为了应对这一挑战,算法网关视频分析网关利用先进的物联网技术,实现了对火灾风险......
  • 鸿蒙开发进阶(HarmonyOS)时域可分层视频编码
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)基础概......
  • 鸿蒙开发进阶(OpenHarmony)扩展组件-系统调用
    鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)基本概念......
  • C++中的各种锁p8
    在多线程开发中,经常会遇到数据同步,很多情况下用锁都是一个很好的选择。C++中常用的锁主要有下面几种:互斥锁(std::mutex)这是最基本的一种锁。它用于保护共享资源,在任意时刻,最多只有一个线程可以获取该锁,从而访问被保护的资源。当一个线程获取了互斥锁后,其他试图获取该锁的线程会......
  • 【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)
    文章目录前言1.auto关键字(C++11)1.1为什么要有auto关键字1.2auto关键字的使用方式1.3auto的使用细则1.4auto不能推导的场景2.基于范围的for循环(C++11)2.1范围for的语法2.2范围for的使用条件3.指针空值nullptr(C++11)3.1为什么会有nullptr这个关键字?前言本......
  • 【C/C++】野指针概念以及避免方式
    C语言中的野指针详解野指针(WildPointer)是指向未定义或非法内存位置的指针。本博客讲解野指针的概念、产生原因、危害以及如何避免野指针的问题。1.什么是野指针野指针指的是未初始化或已经失效的指针变量。这些指针指向的内存位置不再有效,可能被系统回收或被其他变量使......
  • CSP/信奥赛C++完整学习规划(价值2万的csp-j完整课程体系)
    CSP/信奥赛C++课程完整学习视频一站式掌握信奥赛知识冲刺信奥赛拿奖课程购买后永久学习,不受限制!阶段一:《信奥赛C++语法基础》课程目标:轻松入门C++语法课程链接:https://edu.csdn.net/course/detail/39557阶段二:《信奥赛C++语法进阶》课程目标:快速进阶C++语法......
  • java设计模式之工厂模式
    简单分享下java中设计模式–工厂模式工厂模式(FactoryPattern)是面向对象编程中常用的设计模式之一,它属于创建型模式。工厂模式的主要目的是使用工厂方法来创建对象,而不是直接使用new关键字实例化对象。这样可以提高程序的扩展性和维护性。以下是Java中简单工厂模式的案......
  • Python:用 turtle 库打造趣味动画 —— 基础示例与进阶拓展
    以下是一个使用Python的matplotlib库实现的简单动画程序示例,展示了一个正弦波动态变化的效果,标题为《Python与Matplotlib:动态正弦波动画展示》。收起python复制importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.animationasanimation#创......
  • C++_day5
    目录1.模(mú)板template(掌握)1.1概念1.2函数模板1.3类模板2.容器2.1STL标准模板库(熟悉)2.2容器的概念(掌握)2.3顺序容器2.3.1array(C++11)(熟悉)2.3.4deque(掌握)2.4关联容器(掌握)2.5迭代器iterator(掌握)  本章节主要讲解泛型编程,泛型编程(GenericProg......