工厂模式:简单工厂知多少?原理、示例代码、场景及优缺点?

已同步的公众号【蚂蚁博士军团】【码蚁软件】:

工厂模式:简单工厂知多少?原理、示例代码、场景及优缺点?

前言:

       工厂模式中,另一种用得很多的模式是简单工厂模式,直奔主题。

一、简单工厂原理、示例代码

       简单工厂模式是一种创建型设计模式,它提供了一个统一的接口来实例化一组相关或相似的对象,而无需暴露对象的创建逻辑。在简单工厂模式中,客户端通过向工厂类传递参数来获取所需的对象实例,而无需直接调用对象的构造函数。

以下是一个简单的C++源码实现:


#include 
using namespace std;

// 定义一个抽象的产品类
class Product {
public:
    virtual void use() = 0;
};

// 具体产品类A
class ConcreteProductA : public Product {
public:
    void use() override {
        cout << "Using Product A" << endl;
    }
};

// 具体产品类B
class ConcreteProductB : public Product {
public:
    void use() override {
        cout << "Using Product B" << endl;
    }
};

// 简单工厂类
class SimpleFactory {
public:
    // 根据传入的参数创建相应的产品实例
    static Product* createProduct(char productType) {
        Product* product = nullptr;
        switch (productType) {
            case 'A':
                product = new ConcreteProductA();
                break;
            case 'B':
                product = new ConcreteProductB();
                break;
            default:
                break;
        }
        return product;
    }
};

int main() {
    // 通过简单工厂创建产品实例
    Product* productA = SimpleFactory::createProduct('A');
    Product* productB = SimpleFactory::createProduct('B');

    // 使用产品实例
    productA->use();
    productB->use();

    delete productA;
    delete productB;

    return 0;
}

       在上面的示例中,我们定义了一个抽象的产品类 Product,并实现了两个具体产品类 ConcreteProductA 和 ConcreteProductB。然后,我们创建了一个简单工厂类 SimpleFactory,它包含一个静态方法 createProduct,根据传入的参数来实例化相应的产品对象。在 main 函数中,我们通过简单工厂类创建了产品实例,并调用了产品的 use 方法。

       这就是简单工厂模式的基本原理和一个简单的C++实现。这种模式可以帮助我们将对象的创建逻辑与客户端代码分离,使得客户端不需要了解具体的对象创建过程,从而提高了代码的灵活性和可维护性。

二、简单工厂结构图

简单工厂模式的结构图如下所示:

 _________________________           ________________________|          Client         |         |      SimpleFactory     ||-------------------------|         |------------------------||                         |         | + createProduct():Product* ||                         |         |------------------------|| + main()                |         |                        ||_________________________|         |________________________|        |                                     |        |                                     |        |                                     |        |                                     |        |                                     |        |                                     |        |                                     |        |                                     |        |                                     |        |                                     | _______V______________              _________V___________|                       |            |                      ||     Product           |            |    ConcreteProduct   ||-----------------------|            |----------------------|| + use(): void         |            |                      ||_______________________|            |______________________|
 
  

在上面的结构图中,我们可以看到简单工厂模式的三个主要角色:

  1. Client(客户端):客户端通过调用简单工厂类的方法来获取所需的产品实例,而无需直接实例化产品对象。

  2. SimpleFactory(简单工厂):简单工厂类包含了一个静态方法 createProduct,根据传入的参数来实例化具体的产品对象,并返回给客户端。

  3. Product(抽象产品):抽象产品类定义了产品的通用接口,具体的产品类需要实现这个接口。

  4. ConcreteProduct(具体产品):具体产品类是抽象产品的具体实现,它实现了抽象产品定义的接口。

简单工厂模式通过将对象的创建逻辑封装在工厂类中,使得客户端不需要了解具体的对象创建过程,从而降低了客户端代码和具体产品类之间的耦合度。

三、使用场景

简单工厂模式通常适用于以下场景:

  1. 当一个系统只需要一个具体产品对象,而无需对产品对象进行扩展时,可以使用简单工厂模式。例如,一个简单的日志记录器,系统只需要一种日志记录方式,不需要对日志记录器进行扩展。

  2. 当客户端不需要知道对象的创建过程,只需要知道如何使用对象时,可以使用简单工厂模式。简单工厂将对象的创建过程封装起来,使得客户端只需要调用工厂方法来获取所需的对象实例,而无需了解具体的创建细节。

  3. 当需要对对象的创建过程进行集中管理和控制时,可以使用简单工厂模式。简单工厂可以根据需要对对象的创建过程进行调整和优化,而无需影响客户端代码。

总的来说,简单工厂模式适用于那些对象的创建过程相对简单,并且客户端不需要了解具体创建过程的情况。它能够帮助我们将对象的创建逻辑与客户端代码分离,提高了系统的灵活性和可维护性。

四:简单工厂优缺点

简单工厂模式具有以下优点

  1. 封装了对象创建过程:简单工厂模式将对象的创建过程封装在工厂类中,客户端无需了解具体的创建细节,只需要调用工厂方法来获取所需的对象实例。

  2. 降低了客户端和具体产品类的耦合度:客户端只依赖于工厂类,而不依赖于具体产品类,这样在需要更换或者新增产品类的时候,对客户端代码的影响会降到最低。

  3. 可以集中管理和控制对象的创建过程:简单工厂模式可以根据需要对对象的创建过程进行调整和优化,而无需影响客户端代码。

虽然简单工厂模式有诸多优点,但也存在一些缺点

  1. 工厂类职责过重:随着产品种类的增加,工厂类的职责会越来越重,违反了单一职责原则。

  2. 不符合开闭原则:当需要新增产品时,需要修改工厂类的代码,违反了开闭原则,对扩展开放,对修改关闭。

  3. 不易于扩展和维护:一旦需要添加新的产品,就需要修改工厂类的代码,这样会增加代码的复杂度和维护成本。

综上所述,简单工厂模式适用于对象种类较少且变化不频繁的情况,但是在产品种类较多且频繁变化的情况下,简单工厂模式的缺点会显现出来。在实际应用中,需要根据具体情况来选择是否使用简单工厂模式。

你可能感兴趣的:(C++随想录,c++,算法,开发语言,工厂模式,简单工厂模式,码蚁软件)