C++设计模式---工厂模式

C++中工厂模式是一种创建型设计模式,它允许客户端代码通过调用工厂方法来创建对象,而无需直接使用new运算符实例化具体类。这种模式有助于将类的创建与使用相分离,并且在需要添加新的具体类时可以减少对客户端代码的影响。

工厂模式通常有两种实现方式:简单工厂模式和抽象工厂模式。简单工厂模式是最基本的工厂模式,它通过一个静态方法来创建具体的对象。而抽象工厂模式则通过一个抽象工厂类来定义一组创建相关对象的方法,每个具体工厂类实现这些方法来创建特定的对象。

1、简单工厂模式

简单工厂模式是最基本的工厂模式,它通过一个静态方法来创建具体的对象。

cpp 复制代码
#include <iostream>  
#include <string>  
  
// 定义产品接口  【抽象类】
class Product {  
public:  
    virtual ~Product() {}  
    virtual void use() const = 0;  // 纯虚函数必须被子类重写
};  
  
// 定义具体产品类  
class ProductA : public Product {  
public:  
    void use() const override {  
        std::cout << "Using ProductA" << std::endl;  
    }  
};  
  
class ProductB : public Product {  
public:  
    void use() const override {  
        std::cout << "Using ProductB" << std::endl;  
    }  
};  
  
// 定义简单工厂类  
class SimpleFactory {  
public:  
    static Product* createProduct(const std::string& type) {  
        if (type == "A") {  
            return new ProductA();  
        } else if (type == "B") {  
            return new ProductB();  
        } else {  
            return nullptr;  
        }  
    }  
};  
  
// 客户端代码  
int main() {  
    Product* productA = SimpleFactory::createProduct("A");  
    if (productA) {  
        productA->use();  
        delete productA; // 释放内存  
    }  
  
    Product* productB = SimpleFactory::createProduct("B");  
    if (productB) {  
        productB->use();  
        delete productB; // 释放内存  
    }   
    return 0;  
}

结果:

cpp 复制代码
Using ProductA
Using ProductB

2、抽象工厂模式

抽象工厂模式则通过一个抽象工厂类来定义一组创建相关对象的方法,每个具体工厂类实现这些方法来创建特定的对象。

基本结构:

(1)抽象工厂(AbstractFactory):声明了一组用于创建产品对象的操作接口。

(2)具体工厂(ConcreteFactory):实现了抽象工厂接口,负责创建具体产品类的对象。

(3)抽象产品(AbstractProduct):定义了一组产品的接口。

(4)具体产品(ConcreteProduct):实现了抽象产品接口,是具体可使用的产品。

示例:有两个产品族(CarBike),每个产品族都有两个具体产品(SportsCarSedanMountainBikeRoadBike)。

cpp 复制代码
#include <iostream>  
#include <string>  

// 抽象产品  
class Car {  
public:  
    virtual ~Car() {}  
    virtual void show() = 0;  
};  
  
class Bike {  
public:  
    virtual ~Bike() {}  
    virtual void show() = 0;  
};  
  
// 具体产品  
class SportsCar : public Car {  
public:  
    void show() override { std::cout << "SportsCar" << std::endl; }  
};  
  
class Sedan : public Car {  
public:  
    void show() override { std::cout << "Sedan" << std::endl; }  
};  
  
class MountainBike : public Bike {  
public:  
    void show() override { std::cout << "MountainBike" << std::endl; }  
};  
  
class RoadBike : public Bike {  
public:  
    void show() override { std::cout << "RoadBike" << std::endl; }  
};  
  
// 抽象工厂  
class VehicleFactory {  
public:  
    virtual ~VehicleFactory() {}  
    virtual Car* createCar() = 0;      // 纯虚函数,必须被子类重写
    virtual Bike* createBike() = 0;    // 纯虚函数,必须被子类重写
};  
  
// 具体工厂  
class AmericanFactory : public VehicleFactory {  
public:  
    Car* createCar() override { return new SportsCar(); }  
    Bike* createBike() override { return new MountainBike(); }  
};  
  
class EuropeanFactory : public VehicleFactory {  
public:  
    Car* createCar() override { return new Sedan(); }  
    Bike* createBike() override { return new RoadBike(); }  
};  
  
// 客户端代码  
int main() {  
    VehicleFactory* americanFactory = new AmericanFactory();  
    Car* americanCar = americanFactory->createCar();  
    Bike* americanBike = americanFactory->createBike();  
    americanCar->show();  
    americanBike->show();  
  
    VehicleFactory* europeanFactory = new EuropeanFactory();  
    Car* europeanCar = europeanFactory->createCar();  
    Bike* europeanBike = europeanFactory->createBike();  
    europeanCar->show();  
    europeanBike->show();  
  
    // 记得释放内存  
    delete americanCar;  
    delete americanBike;  
    delete europeanCar;  
    delete europeanBike;  
    delete americanFactory;  
    delete europeanFactory;  
  
    return 0;  
}

结果:

cpp 复制代码
SportsCar
MountainBike
Sedan
RoadBike

3、区别

(1)产品类数量:

简单工厂模式:通常只有一个抽象产品类,可以派生出多个具体产品类。

抽象工厂模式:有多个抽象产品类,每个抽象产品类都可以派生出多个具体产品类。

(2)工厂类功能:

简单工厂模式:具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:每个具体工厂类可以创建多个具体产品类的实例,即一个工厂可以创建属于同一产品族但不同等级结构的产品。

(3)接口数量:

简单工厂模式:通常只使用一个接口,用于定义产品的公共方法。

抽象工厂模式:可以使用无限个接口,每个接口对应一个抽象产品类,定义不同产品族的公共方法。

(4)创建对象方式:

简单工厂模式:通过传入参数或配置文件来动态决定创建哪个具体产品类的实例。

抽象工厂模式:无需指定产品的具体类,访问类可以通过抽象工厂接口获取同族的不同等级的产品。

(5)使用场景:

简单工厂模式:适用于创建同种产品类型的复杂参数对象,尤其是当对象的创建过程很复杂,需要很多参数且大部分参数固定时。

抽象工厂模式:适用于系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品的情况。它可以在类的内部对产品族中相关联的多等级产品共同管理。

(6)优缺点:

简单工厂模式:优点:轻量级,代码结构简单清晰,工厂类可以生产不同的产品。缺点:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,可能造成工厂逻辑过于复杂,违背了"开放-封闭"原则。

抽象工厂模式:优点:可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。缺点:需要增加额外的抽象类和接口,增加了系统的复杂性。

相关推荐
平常心的技术小牛1 小时前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆2 小时前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
To_OC2 小时前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
余额瞒着我当琳4 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪4 小时前
WebClient内存配置解析
开发语言·springboot·webflux
东方小月4 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
jdksjw4 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠4 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
ShineWinsu5 小时前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
SL-staff5 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术