工厂模式是一种常用的设计模式,它主要用来解决对象的创建问题,在不暴露对象创建的细节的同时,为客户端提供统一的接口来创建对象。在工厂模式中,客户端不再需要知道创建对象的具体细节,只需要知道需要什么对象即可。

工厂模式分类:

简单工厂模式、工厂方法模式和抽象工厂模式

简单工厂模式

简单工厂模式是一种创建型模式,该模式提供了一个通用接口来创建对象,但是将具体对象的创建逻辑放在了工厂类中。
简单工厂模式:适用于只有一个具体产品类的情况。由工厂类根据客户端的请求来创建一个具体产品对象。适用于需要根据传入的参数动态地创建不同对象的场景。

简单工厂模式的优点是可以提供一个统一的接口来创建对象,使得客户端代码更加简洁。
缺点是不方便扩展,如果要添加新的产品,则需要修改工厂类的代码,不符合开闭原则。

#include <iostream>
using namespace std;

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

// 具体产品类 A
class ProductA : public Product {
public:
    void operation() { cout << "Product A operation." << endl; }
};

// 具体产品类 B
class ProductB : public Product {
public:
    void operation() { cout << "Product B operation." << endl; }
};

// 工厂类
class Factory {
public:
    static Product* createProduct(char type) {
        switch (type) {
            case 'A':
                return new ProductA();
            case 'B':
                return new ProductB();
            default:
                return NULL;
        }
    }
};

int main() {
    Product* productA = Factory::createProduct('A');
    Product* productB = Factory::createProduct('B');
    productA->operation();
    productB->operation();
    return 0;
}

工厂方法模式

工厂方法模式是对简单工厂模式的扩展,它将工厂类的创建方法抽象出来,让每个具体工厂类负责创建特定类型的对象。
工厂方法模式:适用于有多个具体产品类的情况。把具体产品的创建交给具体的工厂类来完成。每个具体工厂只负责创建一个具体产品类的对象。适用于需要创建多种类型的对象,并且每种对象都有其独特的创建逻辑的场景。

工厂方法模式的优点是可以添加新的产品时,只需要添加一个新的具体工厂类即可,不需要修改现有的代码。
缺点是会增加系统的复杂度。

#include <iostream>
using namespace std;

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

// 具体产品类 A
class ProductA : public Product {
public:
    void operation() { cout << "Product A operation." << endl; }
};

// 具体产品类 B
class ProductB : public Product {
public:
    void operation() { cout << "Product B operation." << endl; }
};

// 工厂接口
class Factory {
public:
    virtual Product* createProduct() = 0;
};

// 具体工厂类 A
class FactoryA : public Factory {
public:
    Product* createProduct() { return new ProductA(); }
};

// 具体工厂类 B
class FactoryB : public Factory {
public:
    Product* createProduct() { return new ProductB(); }
};

int main() {
    Factory* factoryA = new FactoryA();
    Factory* factoryB = new FactoryB();
    Product* productA = factoryA->createProduct();
    Product* productB = factoryB->createProduct();
    productA->operation();
    productB->operation();
    return 0;
}

抽象工厂模式

抽象工厂模式是一种创建型模式,它是工厂方法模式的升级版。在该模式中,每个具体工厂类不仅负责创建特定类型的对象,同时还需要创建一组相关的对象。
抽象工厂模式:适用于有多个产品族、每个产品族有多个产品的情况。抽象工厂模式的核心是要定义一个抽象工厂接口,其中包括多个抽象创建方法,每个方法对应一个产品族。具体工厂类实现抽象工厂接口,每个具体工厂类负责创建一个产品族中的多个具体产品类的对象。适用于需要创建一组有关联的对象,且每个工厂类都需要创建相关的对象。例如需要同时创建按钮和文本框。

抽象工厂模式的优点是可以在程序中添加新的产品族,而不需要修改现有的代码。
缺点是添加新的产品需要修改抽象工厂和所有的具体工厂类的代码。

#include <iostream>
using namespace std;

// 抽象产品类 A
class ProductA {
public:
    virtual void operationA() = 0;
};

// 具体产品类 A1
class ProductA1 : public ProductA {
public:
    void operationA() { cout << "Product A1 operation." << endl; }
};

// 具体产品类 A2
class ProductA2 : public ProductA {
public:
    void operationA() { cout << "Product A2 operation." << endl; }
};

// 抽象产品类 B
class ProductB {
public:
    virtual void operationB() = 0;
};

// 具体产品类 B1
class ProductB1 : public ProductB {
public:
    void operationB() { cout << "Product B1 operation." << endl; }
};

// 具体产品类 B2
class ProductB2 : public ProductB {
public:
    void operationB() { cout << "Product B2 operation." << endl; }
};

// 抽象工厂类
class Factory {
public:
    virtual ProductA* createProductA() = 0;
    virtual ProductB* createProductB() = 0;
};

// 具体工厂类 1
class Factory1 : public Factory {
public:
    ProductA* createProductA() { return new ProductA1(); }
    ProductB* createProductB() { return new ProductB1(); }
};

// 具体工厂类 2
class Factory2 : public Factory {
public:
    ProductA* createProductA() { return new ProductA2(); }
    ProductB* createProductB() { return new ProductB2(); }
};

int main() {
    Factory* factory1 = new Factory1();
    Factory* factory2 = new Factory2();
    ProductA* productA1 = factory1->createProductA();
    ProductB* productB1 = factory1->createProductB();
    ProductA* productA2 = factory2->createProductA();
    ProductB* productB2 = factory2->createProductB();
    productA1->operationA();
    productB1->operationB();
    productA2->operationA();
    productB2->operationB();
    return 0;
}

三者的主要区别在于对象创建的角色和职责不同。
简单工厂模式将所有的对象创建放在一个工厂类中,工厂类负责决定创建哪个具体产品对象,并返回给客户端。
工厂方法模式将具体产品的创建交给具体的工厂类来完成,每个具体工厂类只负责创建一个具体产品类的对象。
抽象工厂模式将具体产品的创建交给多个具体工厂类来完成,每个具体工厂类负责创建一个或多个产品族中的多个具体产品类的对象。

其他

  1. 简单工厂模式中,工厂类承担了太多的责任,容易造成代码臃肿和耦合度高的问题。

  2. 工厂方法模式中,每个具体工厂只负责创建一个具体产品,当需要增加新产品时,需要新增一个具体工厂类和具体产品类,扩展性较好,但也会产生大量类的问题。

  3. 抽象工厂模式中,每个工厂可以创建多个产品族,这些产品族中包含了多个具体产品,这种设计适用于复杂的产品结构和业务场景。但是当需要增加新的产品族时,需要新增抽象工厂和具体工厂类,扩展性不如工厂方法模式。

  4. 工厂模式在创建对象时,需要根据实际情况选择具体的模式,否则会导致代码实现不够灵活和效率低下的问题。

  5. 工厂模式将创建对象和具体的实现隔离开来,虽然提高了代码的可维护性和扩展性,但是也带来了额外的开销。

04-25 12:28