设计模式之工厂模式

TechNomad / 2023-06-15 / 原文

一、工厂模式概述

  工厂模式(Factory Pattern)是一种创建型设计模式,旨在提供一种统一的方式来创建对象,将对象的实例化过程封装在一个单独的类中。工厂模式通过定义一个公共的接口来创建对象,但允许子类决定实例化哪个类。这样可以将对象的实例化与客户端代码的耦合度降到最低,同时也提供了一种可扩展的方式来创建对象。

工厂模式通常包含以下角色:

  1. 抽象产品(Abstract Product):定义产品的通用接口,所有具体产品类都应该实现这个接口。

  2. 具体产品(Concrete Product):实现抽象产品接口的具体类。

  3. 抽象工厂(Abstract Factory):定义创建产品的接口,可以是抽象类或接口。通常会声明一个或多个用于创建产品的工厂方法。

  4. 具体工厂(Concrete Factory):实现抽象工厂接口,负责实际创建具体产品的对象。

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

  1. 客户端通过调用抽象工厂的方法来创建产品,而无需直接实例化具体产品类。

  2. 抽象工厂根据客户端的请求,选择合适的具体工厂来创建对应的产品。

  3. 具体工厂根据抽象工厂的定义,创建具体产品的实例并返回给客户端。

  4. 客户端使用返回的产品实例进行操作,而无需关心具体产品的实现细节。

工厂模式的优点包括:

  • 将对象的创建和使用分离,降低了客户端代码与具体产品的耦合度。
  • 可以轻松扩展和添加新的产品,只需添加新的具体产品和对应的具体工厂类,而无需修改现有代码。
  • 提供了一种可替换的方式来创建对象,使得系统更加灵活和可维护。

然而,工厂模式也有一些限制和考虑因素:

  • 增加了系统的复杂性,引入了多个新的类和接口。
  • 在添加新产品时,需要同时添加新的具体产品类和对应的具体工厂类,增加了代码量。
  • 如果产品族的数量增加,可能会导致具体工厂类的爆炸性增长,需要谨慎设计和管理。

总的来说,工厂模式是一种常用且灵活的设计模式,适用于需要统一管理对象创建过程、降低客户端代码与具体产品的耦合度,并且允许动态替换和扩展对象创建的场景。

二、简单工厂模式

  简单工厂模式(Simple Factory Pattern)是工厂模式的一种简化形式,也被称为静态工厂模式。它通过一个专门的工厂类来创建对象,而无需将对象的实例化过程放在客户端代码中。

在简单工厂模式中,有三个主要角色:

  1. 抽象产品(Abstract Product):定义产品的通用接口,所有具体产品类都应该实现这个接口。

  2. 具体产品(Concrete Product):实现抽象产品接口的具体类。

  3. 简单工厂(Simple Factory):负责创建具体产品的工厂类。它通常包含一个静态方法,根据客户端的请求来创建并返回具体产品的实例。

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

  • 将对象的创建过程集中在一个工厂类中,减少了客户端代码与具体产品的直接耦合。
  • 可以通过简单工厂类的静态方法来创建产品,简化了客户端的调用代码。
  • 可以轻松添加新的产品,只需修改简单工厂类的创建方法,而无需修改客户端代码。

然而,简单工厂模式也有一些限制和考虑因素:

  • 工厂类负责创建所有产品,当产品种类较多时,工厂类的代码可能会变得复杂。
  • 添加新产品时,需要修改工厂类的代码,违反了开闭原则。

简单工厂模式适用于需要根据客户端请求来创建不同类型对象的场景,但产品种类较少且不经常变化的情况。它提供了一种简单的方式来封装对象的创建过程,降低了客户端代码与具体产品的耦合度。

 以下是一个示例,演示了如何在C++中实现简单工厂模式:

#include <iostream>
#include <memory>

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

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

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

// 简单工厂类
class SimpleFactory {
public:
    std::unique_ptr<Product> createProduct(const std::string& type) {
        if (type == "A") {
            return std::make_unique<ConcreteProductA>();
        }
        else if (type == "B") {
            return std::make_unique<ConcreteProductB>();
        }
        else {
            // 处理未知产品类型的情况
            return nullptr;
        }
    }
};

int main() {
    // 使用简单工厂创建产品
    SimpleFactory factory;

    std::unique_ptr<Product> productA = factory.createProduct("A");
    if (productA) {
        productA->use();
    }

    std::unique_ptr<Product> productB = factory.createProduct("B");
    if (productB) {
        productB->use();
    }

    std::unique_ptr<Product> unknownProduct = factory.createProduct("C");
    if (!unknownProduct) {
        std::cout << "Unknown product type." << std::endl;
    }

    return 0;
}

打印结果: