Patrón de diseño C++ (patrón de fábrica)


prefacio

Este artículo lo lleva oficialmente a aprender los patrones de diseño en C ++, y este artículo lo lleva principalmente a aprender los patrones de fábrica.

1. ¿Qué es el modo de fábrica?

El patrón de fábrica (Factory Pattern) es un patrón de diseño de creación que proporciona una interfaz para crear objetos, pero retrasa la creación de instancias de objetos específicos en subclases o clases de fábrica específicas. El patrón de fábrica desacopla el código del cliente y el proceso de creación de objetos específicos, de modo que el código del cliente no necesita depender directamente del método de creación de objetos específicos, sino que crea objetos a través de la fábrica, mejorando así la flexibilidad y la capacidad de mantenimiento del código. .

En C++, el patrón de fábrica se puede implementar de varias maneras, incluido el patrón de fábrica simple, el patrón de método de fábrica y el patrón de fábrica abstracto.

Diagrama de estructura UML:

Insertar descripción de la imagen aquí

2. Modo de fábrica simple

El patrón de fábrica simple encapsula el proceso de creación de objetos a través de una clase de fábrica. El cliente pasa diferentes parámetros a la clase de fábrica, y la clase de fábrica crea diferentes objetos específicos en función de los diferentes parámetros. Una de las ventajas del patrón de fábrica simple es que concentra la lógica de creación de objetos en una clase de fábrica, y el código del cliente solo necesita interactuar con la clase de fábrica en lugar de interactuar directamente con objetos específicos.

Código de muestra:

#include <iostream>

using namespace std;

// 抽象产品接口
class Product
{
    
    
public:
	virtual void use() = 0;
};

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

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

//工厂类
class Factory
{
    
    
public:
    static Product* CreateProduct(int type)
    {
    
    
        if (type == 1)
        {
    
    
            return new ConcreteProductA();
        }
        else if (type == 2)
        {
    
    
            return new ConcreteProductB();
        }
        else
        {
    
    
            return NULL;
        }
    }
};

int main(void)
{
    
    
    Product* productA = Factory::CreateProduct(1);
    productA->use();

    Product* productB = Factory::CreateProduct(2);
    productB->use();

    delete productA;
    delete productB;

	return 0;
}

3. Ventajas y desventajas del modelo de fábrica simple

优点:

La lógica de creación de objetos se concentra en una clase de fábrica y el cliente solo necesita interactuar con la clase de fábrica sin prestar atención al proceso de creación de objetos específicos, lo que reduce la complejidad del código del cliente.

El código del cliente está desacoplado del objeto específico y se pueden crear diferentes objetos a través de la clase de fábrica sin modificar el código del cliente, lo que mejora la flexibilidad y escalabilidad del código.

El código del cliente solo necesita conocer la interfaz abstracta del producto sin conocer los detalles del producto específico, para darse cuenta del principio de inversión de dependencia.
Los detalles de implementación de productos específicos se pueden ocultar, lo que mejora la seguridad del código.

缺点:

En violación del principio de apertura y cierre, para cada nuevo producto específico, es necesario modificar la lógica de creación de la clase de fábrica, lo que puede hacer que el código de la clase de fábrica esté demasiado inflado.

La clase de fábrica concentra toda la lógica de creación de objetos. Cuando hay varios productos específicos, el código de la clase de fábrica se volverá complejo y difícil de mantener y ampliar.
La clase de fábrica en el modelo de fábrica simple es responsable de crear todos los productos específicos. Al agregar productos específicos, la clase de fábrica se inflará y no se ajustará al principio de responsabilidad única.

4. Escenarios simples aplicables en fábrica

1. La lógica de creación del objeto es relativamente simple: cuando la lógica del objeto a crear es relativamente simple y no implica juicios condicionales o algoritmos complejos, se puede utilizar el patrón de fábrica simple.

2. Es necesario ocultar los detalles de creación de objetos específicos del código del cliente: a través del modo de fábrica simple, el cliente solo necesita interactuar con la clase de fábrica y no necesita interactuar directamente con objetos específicos, para que la creación Los detalles de objetos específicos se pueden encapsular y ocultar.

3. Necesidad de crear diferentes objetos según diferentes parámetros: cuando necesite elegir crear diferentes objetos específicos según diferentes parámetros o configuraciones, puede utilizar el patrón de fábrica simple. El cliente solo necesita proporcionar los parámetros correspondientes y la clase de fábrica crea el objeto correspondiente de acuerdo con los diferentes parámetros.

4. La cantidad de objetos es relativamente estable: si la cantidad de objetos en el sistema es fija y no cambia con frecuencia, y no es necesario agregar nuevos objetos específicos con frecuencia, el patrón de fábrica simple puede simplificar la creación y administración de objetos. .

5. Uso de clases de fábrica simples.

En Qt, el proceso de creación y gestión de varios objetos se puede realizar utilizando el patrón de fábrica, que es especialmente común en la programación de UI. Aquí hay un ejemplo simple que muestra cómo usar el patrón de fábrica en Qt para crear diferentes tipos de ventanas:

Primero, necesitamos definir una clase de ventana abstracta (AbstractWindow) como la interfaz de producto de la fábrica para representar diferentes tipos de objetos de ventana.

class AbstractWindow : public QWidget
{
    
    
public:
    virtual void display() = 0;
};

A continuación, podemos crear clases de ventana concretas (por ejemplo: MainWindow, DialogWindow, PopupWindow) que heredan de la clase de ventana abstracta e implementan sus métodos correspondientes.

class MainWindow : public AbstractWindow
{
    
    
public:
    void display() override
    {
    
    
        // 实现MainWindow的显示逻辑
    }
};

class DialogWindow : public AbstractWindow
{
    
    
public:
    void display() override
    {
    
    
        // 实现DialogWindow的显示逻辑
    }
};

class PopupWindow : public AbstractWindow
{
    
    
public:
    void display() override
    {
    
    
        // 实现PopupWindow的显示逻辑
    }
};

A continuación, necesitamos crear una clase de fábrica de ventanas (WindowFactory) para crear los tipos correspondientes de objetos de ventana en función de diferentes parámetros.

class WindowFactory
{
    
    
public:
    static AbstractWindow* createWindow(const QString& windowType)
    {
    
    
        if (windowType == "MainWindow")
        {
    
    
            return new MainWindow();
        }
        else if (windowType == "DialogWindow")
        {
    
    
            return new DialogWindow();
        }
        else if (windowType == "PopupWindow")
        {
    
    
            return new PopupWindow();
        }

        return nullptr;
    }
};

En el código del cliente, podemos usar la clase de fábrica de ventanas para crear objetos de ventana específicos.

QString windowType = "MainWindow"; // 可以根据需求指定不同的窗口类型

AbstractWindow* window = WindowFactory::createWindow(windowType);
if (window)
{
    
    
    window->display();
    delete window;
}

A través del código anterior, podemos usar el modo de fábrica para crear objetos de ventana correspondientes según diferentes tipos de ventanas y ejecutar su lógica de visualización específica.

En este ejemplo, la clase de ventana abstracta actúa como la interfaz de producto de la fábrica, la clase de ventana concreta es el producto creado por la fábrica y la clase de fábrica de ventanas es la clase que implementa específicamente el patrón de fábrica. Al utilizar el patrón de fábrica, podemos desacoplar efectivamente la creación y el uso de objetos de ventana y hacer que el programa sea más flexible y escalable.

Resumir

Este artículo lo explicará aquí.

Supongo que te gusta

Origin blog.csdn.net/m0_49476241/article/details/132481553
Recomendado
Clasificación