设计模式——工厂模式

发布时间 2023-04-14 14:33:40作者: 卑以自牧lq

设计模式之工厂模式

简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于封装对象的创建逻辑。在简单工厂模式中,创建对象的逻辑被封装在一个工厂类中,而不是在客户端直接创建对象。

简单工厂模式的主要参与角色:

  1. 产品(Product):即要创建的对象,通常是一个接口或者抽象类,定义了对象的共同接口。

  2. 具体产品(Concrete Product):实现了产品接口的具体对象,由工厂类创建。

  3. 工厂(Factory):负责创建具体产品的工厂类,包含了对象的创建逻辑。根据客户端传入的参数或者条件,决定创建哪种具体产品的对象,并返回给客户端。

简单工厂模式的工作流程如下:

  1. 客户端通过调用工厂类的方法来创建对象,传入相应的参数或者条件。

  2. 工厂类根据传入的参数或者条件,决定创建哪种具体产品的对象。

  3. 工厂类创建具体产品的对象,并返回给客户端。

  4. 客户端通过返回的对象来使用创建好的产品。

简单工厂模式的优点包括:

  1. 将对象的创建逻辑封装在工厂类中,提供了一种集中管理和控制对象创建的方式,降低了代码的复杂度和维护成本。

  2. 客户端通过工厂类来创建对象,不需要直接依赖具体的对象类,从而降低了客户端与具体对象类之间的耦合度,提高了代码的灵活性。

  3. 工厂类可以根据传入的参数或者条件来决定创建哪种具体产品的对象,从而实现了对象的定制化创建。

简单工厂模式的缺点包括:

  1. 工厂类可能会变得比较复杂,包含了大量的创建逻辑,不符合开闭原则,难以扩展和维护。

  2. 当需要创建的产品类型较多时,工厂类的代码可能会变得很复杂和臃肿。

  3. 对象的创建逻辑集中在工厂类中,可能会导致工厂类的职责过重,不符合单一职责原则。

UML图

代码示例

#include <iostream>
using namespace std;

enum class TYPE {
    PRODUCT1,
    PRODUCT2,
    PRODUCT3
};

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

class product1 : public product {
public:
    void    show() { cout << "I'm product1" << endl; }
};

class product2 : public product {
public:
    void    show() { cout << "I'm product2" << endl; }
};

class product3 : public product {
public:
    void    show() { cout << "I'm product3" << endl; }
};

class factory {
public:
    product* make(TYPE type) {
        product* res = nullptr;
        switch (type) {
        case TYPE::PRODUCT1:
            res = new product1();
            break;
        case TYPE::PRODUCT2:
            res = new product2();
            break;
        default:
            res = new product3();
        }
        return res;
    }
};

/*************测试********************/
#include "test.h"

int main()
{
    factory f;
    product* p = f.make(TYPE::PRODUCT1);
    p->show();
    return 0;
}

//输出
I'm product1

简单工厂模式的应用场景

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于创建对象的方式。它将对象的创建逻辑封装在一个工厂类中,通过传入不同的参数来创建不同的对象。简单工厂模式适用于以下场景:

  1. 对象的创建逻辑相对简单且不复杂:简单工厂模式适用于对象的创建逻辑比较简单,不涉及复杂的条件判断或者复杂的算法,只需要根据传入的参数进行简单的处理即可。

  2. 需要根据不同参数创建不同对象:简单工厂模式适用于根据不同的参数值创建不同类型的对象,例如在一个图形绘制软件中,可以根据传入的参数值创建不同形状的图形对象,如圆形、矩形、三角形等。

  3. 需要集中管理对象的创建逻辑:简单工厂模式适用于需要集中管理对象的创建逻辑,避免在多个地方散落着对象的创建代码,从而降低了代码的维护成本。

  4. 需要降低客户端与具体对象类之间的耦合度:简单工厂模式通过将对象的创建逻辑封装在工厂类中,使得客户端代码不直接依赖具体的对象类,从而降低了客户端与具体对象类之间的耦合度,使得客户端更加灵活。

  5. 需要对对象的创建进行扩展和修改:简单工厂模式适用于将来可能需要对对象的创建逻辑进行扩展或者修改的情况,例如需要增加新的对象类型时,只需要修改工厂类的代码而不需要修改客户端代码。

需要注意的是,简单工厂模式并不是一种标准的设计模式,它仅仅是一种简单的对象创建方式,其缺点是工厂类可能会变得比较复杂,不符合开闭原则。在一些复杂的场景中,可能需要考虑使用其他更为灵活和可扩展的创建型设计模式,如工厂方法模式或抽象工厂模式。