创建型模式-工厂方法模式

发布时间 2023-11-10 14:31:32作者: Qt小罗

1 什么是工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但将对象的实际创建延迟到子类中。这样,客户端代码使用工厂方法来创建对象,而不需要了解具体对象的创建细节,从而实现了对象的解耦和灵活性。
工厂方法模式的核心思想是将对象的创建和使用分开,通过一个抽象的工厂接口来定义对象的创建方法,具体的对象创建由子类工厂来实现。这样,当需要创建不同类型的对象时,只需添加新的工厂类即可,而不需要修改客户端使用的代码,符合开闭原则。

2 举个例子

假设我们正在开发一个汽车制造系统,其中有多个车型(如轿车、SUV、跑车等),每个车型都有不同的特点和构造过程。我们希望能够根据客户的需求来创建相应的车型对象。

首先,我们定义一个抽象的汽车接口 Car,其中包含了抽象的方法 drive:

class Car {
public:
    virtual void drive() = 0;
};

然后,我们创建多个具体的汽车类,它们实现了汽车接口,并各自实现了 drive 方法:

class SedanCar : public Car {
public:
    void drive() override {
        cout << "Driving sedan car..." << endl;
    }
};

class SUVCar : public Car {
public:
    void drive() override {
        cout << "Driving SUV car..." << endl;
    }
};

class SportsCar : public Car {
public:
    void drive() override {
        cout << "Driving sports car..." << endl;
    }
};

接下来,我们定义一个抽象的汽车工厂接口 CarFactory,其中包含了一个工厂方法 createCar:

class CarFactory {
public:
    virtual Car* createCar() = 0;
    virtual ~CarFactory() {}
};

然后,我们创建多个具体的汽车工厂类,它们实现了汽车工厂接口,分别负责创建相应的汽车对象:

class SedanCarFactory : public CarFactory {
public:
    Car* createCar() override {
        return new SedanCar();
    }
};

class SUVCarFactory : public CarFactory {
public:
    Car* createCar() override {
        return new SUVCar();
    }
};

class SportsCarFactory : public CarFactory {
public:
    Car* createCar() override {
        return new SportsCar();
    }
};

最后,在客户端代码中,根据客户的需求来创建相应的汽车对象,而不需要了解具体的汽车类和工厂类:

int main() {
    CarFactory* factory1 = new SedanCarFactory();
    Car* sedanCar = factory1->createCar();
    sedanCar->drive();

    CarFactory* factory2 = new SUVCarFactory();
    Car* suvCar = factory2->createCar();
    suvCar->drive();

    CarFactory* factory3 = new SportsCarFactory();
    Car* sportsCar = factory3->createCar();
    sportsCar->drive();

    delete sedanCar;
    delete suvCar;
    delete sportsCar;
    delete factory1;
    delete factory2;
    delete factory3;

    return 0;
}

在上述示例中,我们定义了抽象的汽车接口 Car 和具体的汽车类 SedanCar、SUVCar、SportsCar。同时,我们还定义了抽象的汽车工厂接口 CarFactory 和具体的汽车工厂类 SedanCarFactory、SUVCarFactory、SportsCarFactory。客户端代码根据客户的需求选择相应的工厂,并通过工厂的工厂方法来创建相应的汽车对象。

3 总结

通过工厂方法模式,我们将对象的创建和使用解耦,使得客户端代码只需和抽象的工厂接口打交道,而不需要关心具体的对象创建过程,从而增加了代码的灵活性和可维护性。