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)优缺点:

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

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

相关推荐
金灰3 分钟前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
爱上语文6 分钟前
Java LeetCode每日一题
java·开发语言·leetcode
Манго нектар33 分钟前
JavaScript for循环语句
开发语言·前端·javascript
程序猿小D42 分钟前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
阿华的代码王国1 小时前
【JavaEE】——文件IO的应用
开发语言·python
satan–01 小时前
R语言的下载、安装及环境配置(Rstudio&VSCode)
开发语言·windows·vscode·r语言
电饭叔1 小时前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
Eternal-Student1 小时前
everyday_question dq20240731
开发语言·arm开发·php
卑微求AC2 小时前
(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题
c语言·开发语言
程序猿小D2 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa